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.typeis one ofagents,commands,mcps,settings,hooks,skills,loops,mods./api/v1/version.json:schemaVersion,generatedAt,sha256ofcatalog.jsonand 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
schemaVersionfollows semantic versioning. Everything under/api/v1/is major version 1.- Within major version 1, changes are additive only: new optional fields, new
typevalues, 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
idformat, 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 aDeprecationheader and a changelog entry on the first day. - An
idis permanent for its component. A moved or renamed component appears under a newid; removing a component is not a breaking change. downloadsandscanvalues change daily; their meaning does not.scanis 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.contentfiles 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.