Enterprise DNAEnterprise DNA

Directories API

Eat the index.

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.

JSONOpenAPI 3.1CORS openNo auth7512 entries today

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.

GET/api/catalogue.json

Search and filter a page using collection, q, category, sort, tier, limit and cursor.

GET/api/index.json

A page across the catalogue. The entries field keeps the legacy flattened page shape; follow next for additional pages.

GET/api/{directory}.json

One page from a directory. Directories: agents, skills, mcp-servers, open-source, apps, showcase, models.

GET/api/{directory}/{slug}.json

Single entry with full detail, resolved forward + reverse relations, and a permalink to the OG image.

GET/api/openapi.json

OpenAPI 3.1 spec. Use it to generate a typed client or wire up to an agent.

Per-directory shortcuts

Quick curl

# 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'

Shape, at a glance

Entry summary

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 }
}

Single entry

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"
}

Following the cursor programmatically

// 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());

Fair use

  • The API is free and unauthenticated. Be polite. Cache locally.
  • Browser responses revalidate. Shared caches have a 30-second TTL and a 15-second revalidation window. Cache locally and honour the response headers.
  • Attribution: a link back to enterprisedna.co/directories is appreciated.
  • Want to mirror? Follow the cursor from /api/catalogue.json with unchanged filters. Data can change between requests; start a fresh pass when refreshing your local copy.