Catalog API v1

The whole aitmpl.com catalog of Claude Code components (agents, commands, MCPs, settings, hooks, skills, loops and mods) as static JSON with a published schema. No key, no sign-up, CORS open. Use it from scripts, indexers, editor extensions, mods or agents. This is the only part of the site's data with a stability promise: other JSON files the site serves (/components.json, /components/{type}.json, /counts.json, /search-index.json, and docs/components.json on GitHub) are internal to the site and may change without notice.

Endpoints

  • /api/v1/catalog.json: every component (about 2.8 MB, about 440 KB compressed).
  • /api/v1/catalog/{type}.json: one type, with the same envelope. type is one of agents, commands, mcps, settings, hooks, skills, loops, mods.
  • /api/v1/version.json: schemaVersion, generatedAt, sha256 of catalog.json and counts per type. Poll this one.
  • /api/v1/schema.json: JSON Schema (draft 2020-12) for all of the above.

Every response is application/json; charset=utf-8 with Access-Control-Allow-Origin: *, Cache-Control: public, max-age=300, stale-while-revalidate=3600 and an ETag (send it back as If-None-Match to get a 304).

Polling

# 1. Cheap check (under 1 KB)
curl -s https://www.aitmpl.com/api/v1/version.json

# 2. Download the catalog only when sha256 changed since your last run
curl -s https://www.aitmpl.com/api/v1/catalog.json -o catalog.json

# Or one type, with a conditional request
curl -s -H 'If-None-Match: "<etag from the last response>"' \
  https://www.aitmpl.com/api/v1/catalog/skills.json

Update cadence

The catalog is regenerated whenever a component is added or changed (several times a day on busy days) and once a day after 03:00 UTC, when download counts are refreshed. generatedAt only moves when a component's data actually changed. Polling more often than every 5 minutes gains nothing.

Minimal example

{
  "schemaVersion": "1.0.0",
  "generatedAt": "2026-10-21T03:13:53Z",
  "source": "https://github.com/davila7/claude-code-templates",
  "docs": "https://www.aitmpl.com/developers/catalog-api",
  "count": 1,
  "components": [
    {
      "id": "agents/development-team/frontend-developer",
      "type": "agents",
      "name": "frontend-developer",
      "category": "development-team",
      "path": "development-team/frontend-developer.md",
      "description": "Frontend development specialist for React applications ...",
      "author": null,
      "repo": null,
      "version": null,
      "license": null,
      "keywords": [],
      "downloads": 1234,
      "install": {
        "command": "npx claude-code-templates@latest --agent development-team/frontend-developer",
        "args": ["--agent", "development-team/frontend-developer"]
      },
      "urls": {
        "page": "https://www.aitmpl.com/component/agents/development-team/frontend-developer",
        "source": "https://github.com/davila7/claude-code-templates/blob/main/cli-tool/components/agents/development-team/frontend-developer.md",
        "content": "https://www.aitmpl.com/component-content/agents/development-team/frontend-developer.json"
      },
      "files": null,
      "scan": { "tool": "skillspector", "toolVersion": "2.12.0", "severity": "LOW", "score": 0, "scannedAt": "2026-10-17T20:36:45Z" }
    }
  ]
}

Fields

Every field below is present on every component. A value that is unknown is null, never missing and never an empty string. components is sorted by id. Use id as the key: name alone repeats across categories.

Field Type Meaning
id string {type}/{category}/{name}. Unique in the catalog and permanent for the component; a moved or renamed component gets a new id.
type string Component type, plural. New values may be added in a minor version.
name string Last segment of path, without extension. Not unique on its own.
category string First segment of path.
path string Location under cli-tool/components/{type}/ in the repository: {category}/{name}.md, {category}/{name}.json, or {category}/{name} for skills and mods (directories).
description string Verbatim from the component's frontmatter or JSON; may be empty and may contain Markdown or <example> blocks.
author string | null
repo string | null Upstream repository, when the component declares one.
version string | null
license string | null
keywords array
downloads integer Total recorded installs through the CLI. Refreshed daily.
install object
install.command string Shell command that installs the component in the current project.
install.args array Arguments to pass after `npx claude-code-templates@latest`, as argv (no shell).
urls object
urls.page string The component's page on aitmpl.com.
urls.source string The component on GitHub.
urls.content string | null JSON with the installed file as `content` (plus `files` for mods). Not covered by the v1 stability policy yet. null when the component has no content file.
files array | null Skills and mods: the other files of the directory, relative paths, without the main file (SKILL.md for skills, README.md for mods). null for single-file types.
scan object | null Latest static security scan. A risk hint for display, not a verdict; never used for ordering. null when the component has not been scanned.
scan.tool string Scanner name; currently always skillspector (NVIDIA SkillSpector, static mode).
scan.toolVersion string | null
scan.severity string
scan.score integer | null Risk score: 0-20 LOW, 21-50 MEDIUM, 51-80 HIGH, 81-100 CRITICAL.
scan.scannedAt string | null

Not in the catalog: sponsored placements. The catalog never contains placement data, and its order never depends on downloads, sponsorship or anything but id.

Stability policy

  • schemaVersion follows semantic versioning. Everything under /api/v1/ is major version 1.
  • Within major version 1, changes are additive only: new optional fields, new type values, new enum values, new files. Ignore fields and types you do not know.
  • A breaking change (removing or renaming a field, changing a type or the id format, removing a URL) ships only as a new major version at a new path (/api/v2/). The previous major keeps being published for at least 6 months after that, with a Deprecation header and a changelog entry on the first day.
  • An id is permanent for its component. A moved or renamed component appears under a new id; removing a component is not a breaking change.
  • downloads and scan values change daily; their meaning does not. scan is a static-analysis hint, not a security verdict: read a component before installing it, especially hooks, MCP servers and mods, which run code on your machine.
  • urls.content files are linked for convenience; their format is not yet part of this contract.

Changelog

Format changes are recorded in the catalog API changelog, separate from the CLI's release notes. Watch that file to hear about new fields before they ship.

Contact

If you build on this API, a User-Agent header with a URL or contact helps us reach you before a change. Questions and requests go to GitHub issues. The site's agent-oriented overview is /llms.txt, and /openapi.json describes the same endpoints for OpenAPI tooling.