Skip to main content
Top10Grid

Build with Top10Grid

Embed ranked lists anywhere, fetch curated data via our REST API, and integrate community rankings into your app, blog, or newsletter.

Embed a Top 10 list in one line of HTML

Copy this snippet into any blog, newsletter, or website. Responsive, styled, and dark-mode ready.

Recommended: iframe embed

Self-contained, responsive, works everywhere. Best for blogs, news sites, and newsletters.

Alternative: script embed

Lightweight, integrates with your page styling. Use for custom themes or page builders.

Embed a list (iframe)html
<iframe
  src="https://top10grid.com/embed/YOUR-LIST-SLUG"
  width="480" height="520"
  frameborder="0"
  style="border:none;border-radius:12px;overflow:hidden;max-width:100%"
  title="Top 10 List"
  loading="lazy"
></iframe>

Replace YOUR-LIST-SLUG with any list slug from Top10Grid. Every list page has an "Embed" button that copies this code for you.

Why developers love Top10Grid

Fast REST API

JSON responses with Fastify, sub-50ms latency, open CORS. Fetch any list, search, or trending data — no key required for public endpoints.

Embeddable widgets

Zero-config iframe embeds. Responsive, styled, dark-mode ready. Works on any blog, Notion page, or newsletter.

Structured data

Every list includes entity metadata, categories, tags, and source citations. Build rich integrations with typed data.

API key auth

Simple API key authentication for server-to-server integrations. Rate-limited and audited per key.

CORS & security

Proper CORS headers, rate limiting, and input validation on every endpoint. No surprises.

Webhook support

Automation-ready API. Publish lists, sync content, and trigger actions via webhooks from any workflow tool.

Quick start: fetch a list in 3 lines

Fetch a listjavascript
const res = await fetch(
  "https://top10grid.com/api/v1/lists/YOUR-SLUG"
);
const list = await res.json();
console.log(list.title, list.items);
Search listsjavascript
const res = await fetch(
  "https://top10grid.com/api/v1/search?q=best+albums"
);
const { data } = await res.json();
data.forEach(list =>
  console.log(list.title, list.category)
);

Public API — no key required

Every endpoint under /api/v1/public/ is open: no API key, no sign-up, CORS enabled for any origin, responses cached for 5 minutes, and a limit of 60 requests per minute per IP. Start here — the key-authenticated endpoints below are only needed for writing.

Sending a scripted request? Set a descriptive User-Agent. Requests whose user-agent contains curl/, wget/ or python-requests are refused with 429 bot_blocked on the authenticated routes. The public routes above are always exempt.

GET
/api/v1/public/lists

Published public lists, newest first. Query: ?skip (default 0), ?take (1-100, default 20), ?category. Returns { data: [...], meta: { total, skip, take } }.

GET
/api/v1/public/lists/:slug

One list in full — description, cover image, author, and every item with its title, rank, description and imageUrl. 404 if the list is not published or not public.

GET
/api/v1/public/categories

Every category with its published list count. Cached 1 hour.

GET
/api/v1/public/trending

Lists ranked by a time-decayed vote score. Query: ?take (1-100, default 10). Cached 2 minutes.

Fetch a list with all its itemsbash
curl -H 'User-Agent: MyApp/1.0' \
  'https://top10grid.com/api/v1/public/lists/top-10-greatest-rappers-of-all-time'
Response shapejson
{
  "data": {
    "title": "Top 10 Greatest Rappers of All Time",
    "slug": "top-10-greatest-rappers-of-all-time",
    "category": "MUSIC",
    "itemCount": 10,
    "items": [
      { "rank": 1, "title": "...", "description": "...", "imageUrl": "..." }
    ]
  }
}

API reference

Base URL: https://top10grid.com/api/v1 | No-auth public endpoints

Lists

GET
/lists

Browse all published lists. Supports ?category, ?locale, ?trending, ?page, ?pageSize filters.

GET
/lists/:slug

Fetch a single list with all items, sources, tags, and metadata.

POST
/lists

Create a new list. Requires authentication.

GET
/lists/:slug/twitter-thread

Generate a shareable Twitter thread for any list.

Search

GET
/search

Full-text search across all lists and items. Supports ?q query parameter.

GET
/search/suggestions

Autocomplete suggestions for search queries.

Trending & Discovery

GET
/trends

Trending lists across all categories.

GET
/daily/list

The featured list of the day.

GET
/recommendations

Personalized list recommendations (auth optional).

Users & Social

GET
/users/:username

Fetch a public user profile with stats and badges.

GET
/users/:username/lists

Lists by a specific curator.

Entities

GET
/entities/:id

Fetch an entity with cross-list appearances.

GET
/people

Browse people rankings across categories.

GET
/services

Browse service/product rankings.

Getting Started

1

Generate an API key

Go to Settings → API Keys and create a new key. Choose only the scopes you need. The raw key is shown once — store it securely.

2

Make your first request

Include your key in the Authorization header:

First request (curl)bash
curl https://top10grid.com/api/v1/lists?category=technology \
  -H "Authorization: Bearer t10_YOUR_API_KEY"
3

Understand authentication

API keys use the Authorization: Bearer t10_… header format. Public read endpoints (lists, search, trending) work without a key, but are rate-limited to 60 req/min per IP. Authenticated endpoints require a key with the appropriate scope.

4

Rate limits

Each API key has its own rate limit (default 60 req/min). You can adjust this in Settings → API Keys. When you exceed the limit the API returns 429 Too Many Requests.

Authentication

Public endpoints

Most read endpoints (lists, search, trending) are public and require no authentication. Rate limited to 100 requests per minute per IP.

API key authentication

For server-to-server integrations, use an API key in the Authorization: Bearer t10_YOUR_KEY header. Manage your keys →

API Key Scopes

Each API key carries one or more scopes that control which endpoints it can call. Grant only the scopes your integration actually needs.

ScopeAllowsEndpoints
READ_LISTRead and search listsGET /lists/search, GET /lists/:id
CREATE_LISTCreate new listsPOST /lists
CREATE_ITEMSAdd items to listsPOST /lists/:id/items
UPDATE_LISTEdit list metadataPATCH /lists/:id
PUBLISH_LISTPublish listsPOST /lists/:id/publish
FULL_ACCESSAll of the aboveAll API endpoints

Rate limits

TierRate limitNotes
Anonymous100 req/minPer IP address
Authenticated100 req/minPer user ID
API keyCustomConfigured per key

Ready to build?

Start with the embed widget for instant integration, or explore the full API for custom builds.