Endpoints
Published records as bounded JSON. Lists contain at most 24 results. Follow the opaque next cursor with the same filters until it is null. Public responses are cached for 30 seconds at the edge.
Directories API
Every entry on Directories is available as JSON. Build a custom dashboard. Feed an agent. Score a stack. The index is meant to be consumed, not just browsed.
Published records as bounded JSON. Lists contain at most 24 results. Follow the opaque next cursor with the same filters until it is null. Public responses are cached for 30 seconds at the edge.
/api/catalogue.jsonSearch and filter a page using collection, q, category, sort, tier, limit and cursor.
/api/index.jsonA page across the catalogue. The entries field keeps the legacy flattened page shape; follow next for additional pages.
/api/{directory}.jsonOne page from a directory. Directories: agents, skills, mcp-servers, open-source, apps, showcase, models.
/api/{directory}/{slug}.jsonSingle entry with full detail, resolved forward + reverse relations, and a permalink to the OG image.
/api/openapi.jsonOpenAPI 3.1 spec. Use it to generate a typed client or wire up to an agent.
# Fetch one catalogue page
curl -s https://enterprisedna.co/directories/api/index.json | jq '{items: .items, next: .next}'
# Pull the first page of one directory
curl -s https://enterprisedna.co/directories/api/agents.json | jq '.entries[].slug'
# Pull a single entry with all relations resolved
curl -s https://enterprisedna.co/directories/api/agents/claude-code.json | jq '.'
# Discover the schema
curl -s https://enterprisedna.co/directories/api/openapi.json | jq '.paths | keys'The shape returned by /api/index.json.
{
"items": [{
"collection": "agents",
"slug": "claude-code",
"url": "/directories/agents/claude-code",
"data": { "name": "Claude Code", "tagline": "…" },
"review": null,
"revision": 1
}],
"next": "opaque-cursor-or-null",
"query": { "collection": "agents", "limit": 24 }
}What /api/{directory}/{slug}.json returns. Adds description, useCases, pros, cons, ogImage, and resolved relations.
{
"directory": "...",
"slug": "...",
"relations": {
"forward": [
{ "key": "uses", "label": "Uses", "entries": [...] }
],
"reverse": [
{ "key": "used_by", "label": "Used by", "entries": [...] }
]
},
"ogImage": "https://enterprisedna.co/directories/og/...png"
}// Node 22+, ES modules. Keep filters unchanged between pages.
const records = new Map();
let cursor = null;
do {
const url = new URL('https://enterprisedna.co/directories/api/catalogue.json');
url.searchParams.set('collection', 'agents');
if (cursor) url.searchParams.set('cursor', cursor);
const response = await fetch(url);
if (!response.ok) throw new Error('Catalogue request failed');
const page = await response.json();
for (const entry of page.items) records.set(entry.slug, entry);
cursor = page.next;
} while (cursor);
// Fetch one record for its complete metadata and resolved relationships.
const claude = await fetch(
'https://enterprisedna.co/directories/api/agents/claude-code.json'
).then(response => response.json());/api/catalogue.json with unchanged filters. Data can change between requests; start a fresh pass when refreshing your local copy.