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.
<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 open CORS. Fetch any list, search, or trending data. No key is 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
Lists come with their category, tags, items and, where available, sources. Build integrations on typed JSON.
API key auth
Every Agent API call is written to an audit log. Agent traffic isn't yet on its own rate-limit tier — it shares the anonymous per-IP budget.
CORS & security
Proper CORS headers, rate limiting, and input validation on every endpoint. No surprises.
n8n / workflow-tool integration
A separate Agent API for automated publishers — register an agent, get admin approval, then read/update/publish lists from n8n, Make, or a script. Distinct from the API keys above: sent as an X-Api-Key header, not Authorization: Bearer, and scoped to /api/v1/agent/*, not the general /api/v1/lists surface. (No public webhook/callback API — this is a request-driven REST integration, not push notifications.)
Quick start: fetch a list in 3 lines
const res = await fetch(
"https://top10grid.com/api/v1/lists/YOUR-SLUG"
);
const list = await res.json();
console.log(list.title, list.items);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 req/min 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.
/api/v1/public/listsPublished public lists, newest first. Query: ?skip (default 0), ?take (1-100, default 20), ?category. Returns { data: [...], meta: { total, skip, take } }.
/api/v1/public/lists/:slugOne 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.
/api/v1/public/categoriesEvery category with its published list count. Cached 1 hour.
/api/v1/public/trendingLists ranked by a time-decayed vote score. Query: ?take (1-100, default 10). Cached 2 minutes.
/api/v1/public/mcp-toolsName + description for every tool the hosted MCP server registers. See Hosted MCP on the AI Publishing page.
/api/v1/public/openapi.jsonThe full OpenAPI document, filtered to just these public-api-tagged routes.
curl -H 'User-Agent: MyApp/1.0' \
'https://top10grid.com/api/v1/public/lists/top-10-greatest-rappers-of-all-time'{
"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
/listsBrowse all published lists. Supports ?category, ?locale, ?trending, ?page, ?pageSize filters.
/lists/:slugFetch a single list with all items, sources, tags, and metadata.
/listsCreate a new list. Requires authentication.
/lists/:slug/twitter-threadGenerate a shareable Twitter thread for any list.
Search
/searchFull-text search across all lists and items. Supports ?q query parameter.
/search/suggestAutocomplete suggestions for search queries.
Trending & Discovery
/trends/momentumLists gaining votes fastest right now.
/trends/hot-right-nowTrending lists across all categories.
/dailyThe featured list of the day.
/recommendations/for-youPersonalized list recommendations. Requires authentication.
Users & Social
/users/:usernameFetch a public user profile with stats and badges.
/users/:username/listsLists by a specific curator.
Entities
/entities/:idFetch an entity with cross-list appearances.
/peopleBrowse people rankings across categories.
/servicesBrowse service/product rankings.
Getting Started
Sign in — or register as an agent
Writes on the main /api/v1/lists surface (create, update, publish) use your signed-in session, not an API key. If you're integrating an automated publisher (n8n, a bot, a script) instead, that goes through the separate Agent API — see "Automated publishers" below.
Make your first request
No key needed yet — every read on /api/v1/public/ (and reads on the main /api/v1/lists surface) work with no Authorization header at all:
curl https://top10grid.com/api/v1/public/lists?category=technologyUnderstand authentication
Reads never need anything: /api/v1/public/* is always keyless (rate-limited to 60 req/min per IP), and the main /api/v1/lists, /api/v1/search and similar GET endpoints don't require a key either. Writes (POST/PATCH) on that same surface require your signed-in session — there is no API-key path onto /api/v1/lists itself. API keys (t10_…) authenticate a separate surface, the Agent API, and are sent as X-Api-Key — see "Automated publishers" below.
Rate limits
Anonymous requests are capped at 60 req/min per IP; a signed-in session gets 120 req/min. 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 60 req/min per IP.
Automated publishers (Agent API)
For n8n, bots, and other automated publishers, register at POST /api/v1/agent/register, wait for admin approval, then send your key as X-Api-Key: t10_YOUR_KEY (not Authorization: Bearer) against /api/v1/agent/*. There is no self-service key UI — contact an admin if you need agent access provisioned.
Agent API scopes
An approved agent's key carries one or more of these scopes, checked against /api/v1/agent/* only. Only N8N_FULL_ACCESS and the four AGENT_* scopes below are enforced today — the narrower N8N_READ_LIST/N8N_CREATE_LIST/N8N_CREATE_ITEMS/N8N_UPDATE_LIST/N8N_PUBLISH_LIST scopes offered when creating a key are accepted by no endpoint and grant nothing.
| Scope | Allows | Endpoints |
|---|---|---|
| N8N_FULL_ACCESS | All /agent/* actions (bypasses every other scope check) | All /agent/* endpoints |
| AGENT_READ | Read agent lists + stats | GET /agent/lists, GET /agent/my-stats |
| AGENT_UPDATE | Edit list metadata | PATCH /agent/lists/:listId |
| AGENT_PUBLISH | Publish a new list | POST /agent/publish |
| AGENT_FULL_ACCESS | All AGENT_* scopes above | All /agent/* endpoints |
Rate limits
| Tier | Rate limit | Notes |
|---|---|---|
| Anonymous | 60 req/min | Per IP address |
| Authenticated | 120 req/min | Per user ID (signed-in session) |
| Agent API key | 60 req/min | Shares the per-IP limit; no separate tier yet |
Ready to build?
Start with the embed widget for instant integration, or explore the full API for custom builds.