REST API Reference
APM registry API endpoints for packages, search, and skill content
Base URL
https://apm.orthg.nlAll 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/nameEndpoints
GET /api/packages
List packages with pagination and sorting.
Query parameters:
| Parameter | Type | Default | Description |
|---|---|---|---|
page | integer | 1 | Page number (min 1) |
pageSize | integer | 20 | Results per page (1–100) |
sort | string | "name" | Sort field: "name", "stars", or "indexed" |
order | string | "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:
| Field | Type | Description |
|---|---|---|
id | string | Package UUID |
scope | string | Namespace (e.g. apm) |
name | string | Package name |
description | string | Human-readable description |
kind | string | skill, composite, workflow, or app |
category | string? | Category (e.g. tooling, code-review) |
tags | string[] | Searchable tags |
compatibility | string[] | Compatible agents (e.g. claude, cursor) |
language | string? | Primary language (e.g. en, zh) |
version | string? | Semver version (e.g. 1.0.0) |
sourceRepo | string | GitHub owner/repo |
sourcePath | string | Directory path within the repo |
sourceRef | string | Git branch (usually main) |
repoUrl | string? | Full GitHub URL |
homepageUrl | string? | Project homepage |
repoOwner | string | GitHub owner |
author | string? | Package author |
repoStars | number | GitHub stars |
license | string? | SPDX license identifier |
skillMdRaw | string | Full SKILL.md content |
frontmatter | object | Parsed YAML frontmatter |
allowedTools | string[] | Tools the skill is allowed to use |
tokenCount | number | Approximate LLM token count |
fileCount | number | Number of files in the skill |
progressiveDisclosure | boolean | Whether the skill uses progressive disclosure |
downloadCount | number | Total download/install count |
depCount | number | Number of dependencies |
dependantCount | number | Number of packages depending on this |
verified | boolean | Whether the publisher is verified |
featured | boolean | Whether the package is featured |
status | string | active, deprecated, or delisted |
hosted | boolean | Whether hosted on APM (vs proxied from GitHub) |
lastCommitSha | string? | Git blob SHA of the SKILL.md file |
firstIndexedAt | string | ISO 8601 timestamp |
lastIndexedAt | string | ISO 8601 timestamp |
Errors:
| Status | Body |
|---|---|
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:
| Parameter | Type | Required | Description |
|---|---|---|---|
q | string | Yes | Search 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:
| Status | Body |
|---|---|
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 command | API call |
|---|---|
apm install @scope/name | GET /api/packages/@scope/name then POST /api/packages/@scope/name/track |
apm search <query> | GET /api/search?q=<query> |
apm info @scope/name | GET /api/packages/@scope/name |
You can override the registry URL with --registry or the APM_REGISTRY environment variable.