apmdocs

REST API Reference

APM registry API endpoints for packages, search, and skill content

Base URL

https://apm.orthg.nl

All endpoints return JSON unless otherwise noted.

Package naming

All packages use scoped names: @scope/name. API paths use the scoped format directly:

/api/packages/@scope/name

Endpoints

GET /api/packages

List packages with pagination and sorting.

Query parameters:

ParameterTypeDefaultDescription
pageinteger1Page number (min 1)
pageSizeinteger20Results per page (1–100)
sortstring"name"Sort field: "name", "stars", or "indexed"
orderstring"asc"Sort order: "asc" or "desc"

Response:

{
  "data": [
    {
      "scope": "apm",
      "name": "install",
      "description": "Install an APM skill by scoped name",
      "kind": "skill",
      "sourceRepo": "orthogonalhq/apm-skills",
      "repoOwner": "orthogonalhq",
      "repoStars": 12,
      "license": "MIT",
      "lastIndexedAt": "2026-03-17T00:00:00.000Z"
    }
  ],
  "total": 142,
  "page": 1,
  "pageSize": 20
}

GET /api/packages/@:scope/:name

Get full details for a single package.

Response:

{
  "id": "uuid",
  "scope": "apm",
  "name": "install",
  "description": "Install an APM skill by scoped name",
  "kind": "skill",
  "category": "tooling",
  "tags": ["cli", "install"],
  "compatibility": ["claude", "cursor"],
  "language": "en",
  "version": "1.0.0",
  "sourceRepo": "orthogonalhq/apm-skills",
  "sourcePath": "install",
  "sourceRef": "main",
  "repoUrl": "https://github.com/orthogonalhq/apm-skills",
  "homepageUrl": null,
  "repoOwner": "orthogonalhq",
  "author": "orthogonalhq",
  "repoStars": 12,
  "license": "MIT",
  "skillMdRaw": "---\nname: install\n...",
  "frontmatter": { "name": "install", "description": "..." },
  "allowedTools": [],
  "tokenCount": 450,
  "fileCount": 1,
  "progressiveDisclosure": false,
  "downloadCount": 0,
  "depCount": 0,
  "dependantCount": 0,
  "verified": true,
  "featured": false,
  "status": "active",
  "hosted": false,
  "firstIndexedAt": "2026-03-17T00:00:00.000Z",
  "lastIndexedAt": "2026-03-17T00:00:00.000Z",
  "lastCommitSha": "ab54924ef311c6521e93f1f85fec24ca6b05e875"
}

Field reference:

FieldTypeDescription
idstringPackage UUID
scopestringNamespace (e.g. apm)
namestringPackage name
descriptionstringHuman-readable description
kindstringskill, composite, workflow, or app
categorystring?Category (e.g. tooling, code-review)
tagsstring[]Searchable tags
compatibilitystring[]Compatible agents (e.g. claude, cursor)
languagestring?Primary language (e.g. en, zh)
versionstring?Semver version (e.g. 1.0.0)
sourceRepostringGitHub owner/repo
sourcePathstringDirectory path within the repo
sourceRefstringGit branch (usually main)
repoUrlstring?Full GitHub URL
homepageUrlstring?Project homepage
repoOwnerstringGitHub owner
authorstring?Package author
repoStarsnumberGitHub stars
licensestring?SPDX license identifier
skillMdRawstringFull SKILL.md content
frontmatterobjectParsed YAML frontmatter
allowedToolsstring[]Tools the skill is allowed to use
tokenCountnumberApproximate LLM token count
fileCountnumberNumber of files in the skill
progressiveDisclosurebooleanWhether the skill uses progressive disclosure
downloadCountnumberTotal download/install count
depCountnumberNumber of dependencies
dependantCountnumberNumber of packages depending on this
verifiedbooleanWhether the publisher is verified
featuredbooleanWhether the package is featured
statusstringactive, deprecated, or delisted
hostedbooleanWhether hosted on APM (vs proxied from GitHub)
lastCommitShastring?Git blob SHA of the SKILL.md file
firstIndexedAtstringISO 8601 timestamp
lastIndexedAtstringISO 8601 timestamp

Errors:

StatusBody
400{ "error": "Invalid package path. Use @scope/name" }
404{ "error": "Package not found" }

GET /api/packages/@:scope/:name/skill-md

Get the raw SKILL.md content for a package.

Response: Plain text SKILL.md content (Content-Type: text/markdown).


GET /api/packages/@:scope/:name/source

Redirects to the source repository on GitHub.

Response: 302 redirect to https://github.com/<sourceRepo>.


GET /api/search?q=...

Full-text search across scopes, package names, and descriptions.

Query parameters:

ParameterTypeRequiredDescription
qstringYesSearch query

Response:

{
  "results": [
    {
      "scope": "apm",
      "name": "search",
      "description": "Search the APM registry for agent skills",
      "kind": "skill",
      "category": "tooling",
      "sourceRepo": "orthogonalhq/apm-skills",
      "tokenCount": 320,
      "verified": true
    }
  ],
  "total": 3
}

Returns up to 50 results, ranked by relevance. An empty or missing q parameter returns { "results": [], "total": 0 }.

Search uses PostgreSQL full-text search with English tokenization. Queries are split by whitespace and matched as prefix terms (e.g., "code rev" matches "code-review").


POST /api/packages/@:scope/:name/track

Track a download/install event for a package. Increments the package's download count.

Request: No body required.

Response:

{ "ok": true }

Errors:

StatusBody
404{ "error": "Not found" }

The web UI calls this automatically when a user copies or downloads a SKILL.md file (once per page visit). The CLI calls this on apm install.


Usage from the CLI

The APM CLI uses this API under the hood:

CLI commandAPI call
apm install @scope/nameGET /api/packages/@scope/name then POST /api/packages/@scope/name/track
apm search <query>GET /api/search?q=<query>
apm info @scope/nameGET /api/packages/@scope/name

You can override the registry URL with --registry or the APM_REGISTRY environment variable.

On this page