Documentation Index
Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
HTTP API
Base URL:https://clawhub.ai (default).
All v1 paths are under /api/v1/....
Legacy /api/... and /api/cli/... remain for compatibility (see DEPRECATIONS.md).
OpenAPI: /api/v1/openapi.json.
Public catalog reuse
Third-party directories may use the public read endpoints to list or search ClawHub skills. Please cache results, honor429/Retry-After, link users back to the canonical ClawHub listing (https://clawhub.ai/<owner>/<slug>), and avoid implying ClawHub endorsement of the third-party site. Do not attempt to mirror hidden, private, or moderation-blocked content outside the public API surface.
Web slug shortcuts resolve across registry families, but API clients should use
the canonical URLs returned by read endpoints instead of reconstructing route
precedence.
Rate limits
Enforcement model:- Anonymous requests: enforced per IP.
- Authenticated requests (valid Bearer token): enforced per user bucket.
- If token is missing/invalid, behavior falls back to IP enforcement.
-
Authenticated write endpoints should not return a bare
Unauthorizedwhen the server knows the reason. Missing tokens, invalid/revoked tokens, and deleted/banned/disabled accounts should each get actionable text so CLI clients can tell users what blocked them. - Read: 600/min per IP, 2400/min per key
- Write: 45/min per IP, 180/min per key
-
Download: 30/min per IP, 180/min per key (
/api/v1/download)
- Legacy compatibility:
X-RateLimit-Limit,X-RateLimit-Remaining,X-RateLimit-Reset - Standardized:
RateLimit-Limit,RateLimit-Remaining,RateLimit-Reset - On
429:Retry-After
X-RateLimit-Reset: absolute Unix epoch secondsRateLimit-Reset: seconds until reset (delay)Retry-After: seconds to wait before retry (delay) on429
429 response:
- If
Retry-Afterexists, wait that many seconds before retry. - Use jittered backoff to avoid synchronized retries.
- If
Retry-Afteris missing, fallback toRateLimit-Reset(or compute fromX-RateLimit-Reset).
- Uses
cf-connecting-ip(Cloudflare) for client IP by default. - ClawHub uses trusted forwarding headers to identify client IPs at the edge.
- If no trusted client IP is available, anonymous download requests use an endpoint-scoped fallback bucket instead of one global
ip:unknownbucket. Anonymous read/write requests still use the shared unknown bucket so missing-IP routing remains visible and conservative.
Public endpoints (no auth)
GET /api/v1/search
Query params:
q(required): query stringlimit(optional): integerhighlightedOnly(optional):trueto filter to highlighted skillsnonSuspiciousOnly(optional):trueto hide suspicious (flagged.suspicious) skillsnonSuspicious(optional): legacy alias fornonSuspiciousOnly
- Results are returned in relevance order (embedding similarity + exact slug/name token boosts + popularity prior from downloads).
- Relevance is stronger than popularity. A precise slug or display-name token match can outrank a looser match with many more downloads.
- ASCII text is tokenized on word and punctuation boundaries. For example,
personal-mapcontains a standalonemaptoken, whileamap-jsapi-skillcontainsamap,jsapi, andskill; searching formaptherefore givespersonal-mapa stronger lexical match thanamap-jsapi-skill. - Downloads are used as a small log-scaled prior and tie-breaker, not as the primary ranking signal. High-download skills can rank lower when the query text is a weaker match.
- Suspicious or hidden moderation state can remove a skill from public search depending on caller filters and current moderation status.
- Put the terms users will literally search for in the display name, summary, and tags. Use a standalone slug token only when it is also a stable identity you want to keep.
- Do not rename a slug just to chase one query unless the new slug is a better long-term canonical name. Old slugs become redirect aliases, but the canonical URL, displayed slug, and future search digests use the new slug.
- Rename aliases preserve resolution for old URLs and installs that resolve through the registry, but search ranking is based on the canonical skill metadata after the rename has indexed. Existing stats stay with the skill.
- If a skill is unexpectedly invisible, check moderation state first with
clawhub inspect <slug>while logged in before changing ranking-related metadata.
GET /api/v1/skills
Query params:
limit(optional): integer (1–200)cursor(optional): pagination cursor for any non-trendingsortsort(optional):updated(default),createdAt(alias:newest),downloads,stars(alias:rating),installsCurrent(alias:installs),installsAllTime,trendingnonSuspiciousOnly(optional):trueto hide suspicious (flagged.suspicious) skillsnonSuspicious(optional): legacy alias fornonSuspiciousOnly
trendingranks by installs in the last 7 days (telemetry-based).createdAtis stable for new-skill crawls;updatedchanges when existing skills are republished.- When
nonSuspiciousOnly=true, cursor-based sorts may return fewer thanlimititems on a page because suspicious skills are filtered after page retrieval. - Use
nextCursorto continue pagination when present. A short page does not by itself mean end-of-results.
GET /api/v1/skills/{slug}
Response:
- Old slugs created by owner rename/merge flows resolve to the canonical skill.
metadata.os: OS restrictions declared in skill frontmatter (e.g.["macos"],["linux"]).nullif not declared.metadata.systems: Nix system targets (e.g.["aarch64-darwin", "x86_64-linux"]).nullif not declared.metadataisnullif the skill has no platform metadata.moderationis included only when the skill is flagged or the owner is viewing it.
GET /api/v1/skills/{slug}/moderation
Returns structured moderation state.
Response:
- Owners and moderators can access moderation details for hidden skills.
- Public callers only get
200for already-flagged visible skills. - Evidence is redacted for public callers and only includes raw snippets for owners/moderators.
POST /api/v1/skills/{slug}/report
Report a skill for moderator review. Reports are skill-level, optionally linked
to a version, and feed the skill report queue.
Auth:
- Requires an API token.
POST /api/v1/skills/{slug}/appeal
Skill owner/publisher endpoint for appealing moderation on a skill.
Auth:
- Requires an API token for the skill owner or publisher member.
GET /api/v1/skills/-/reports
Moderator/admin endpoint for skill report intake.
Query params:
status(optional):open(default),confirmed,dismissed, oralllimit(optional): integer (1-200)cursor(optional): pagination cursor
POST /api/v1/skills/-/reports/{reportId}/triage
Moderator/admin endpoint for resolving or reopening skill reports.
Request:
note is required for confirmed and dismissed; it may be omitted when
setting status back to open. Pass finalAction: "hide" with a triaged
report to hide the skill in the same auditable workflow.
GET /api/v1/skills/-/appeals
Moderator/admin endpoint for skill appeal intake.
Query params:
status(optional):open(default),accepted,rejected, oralllimit(optional): integer (1-200)cursor(optional): pagination cursor
POST /api/v1/skills/-/appeals/{appealId}/resolve
Moderator/admin endpoint for accepting, rejecting, or reopening a skill appeal.
note is required for accepted and rejected; it may be omitted when setting
status back to open. Pass finalAction: "restore" with an accepted appeal
to make the skill available again.
GET /api/v1/skills/{slug}/versions
Query params:
limit(optional): integercursor(optional): pagination cursor
GET /api/v1/skills/{slug}/versions/{version}
Returns version metadata + files list.
version.securityincludes normalized scan verification status and scanner details (VirusTotal + LLM), when available.
GET /api/v1/skills/{slug}/scan
Returns security scan verification details for a skill version.
Query params:
version(optional): specific version string.tag(optional): resolve a tagged version (for examplelatest).
- If neither
versionnortagis provided, uses the latest version. - Includes normalized verification status plus scanner-specific details.
security.capabilityTagsincludes deterministic capability/risk labels such ascrypto,requires-wallet,can-make-purchases,can-sign-transactions,requires-oauth-token, andposts-externallywhen detected.security.hasScanResultistrueonly when a scanner produced a definitive verdict (clean,suspicious, ormalicious).moderationis a current skill-level moderation snapshot derived from the latest version.- When querying a historical version, check
moderation.matchesRequestedVersionandmoderation.sourceVersionbefore treatingmoderationandsecurityas the same version context.
GET /api/v1/skills/{slug}/file
Returns raw text content.
Query params:
path(required)version(optional)tag(optional)
- Defaults to latest version.
- File size limit: 200KB.
GET /api/v1/packages
Unified catalog endpoint for:
- skills
- code plugins
- bundle plugins
limit(optional): integer (1–100)cursor(optional): pagination cursorfamily(optional):skill,code-plugin, orbundle-pluginchannel(optional):official,community, orprivateisOfficial(optional):trueorfalseexecutesCode(optional):trueorfalsecapabilityTag(optional): capability filter for plugin packagestarget/hostTarget(optional): shorthand forhost:<target>os,arch,libc(optional): shorthand for host capability filtersrequiresBrowser,requiresDesktop,requiresNativeDeps,requiresExternalService,requiresBinary,requiresOsPermission(optional):true/1shorthand for environment requirement tagsexternalService,binary,osPermission(optional): shorthand for named environment requirement tagsartifactKind(optional):legacy-zipornpm-packnpmMirror(optional):true/1to show ClawPack-backed package versions available through the npm mirror
GET /api/v1/code-pluginsandGET /api/v1/bundle-pluginsremain fixed-family aliases.- Skill entries stay backed by the skill registry and can still be published only through
POST /api/v1/skills. POST /api/v1/packagesis still only for code-plugin and bundle-plugin releases.- Anonymous callers only see public package channels.
- Authenticated callers can see private packages for publishers they belong to in list/search results.
channel=privateonly returns packages the authenticated caller can read.
GET /api/v1/packages/search
Unified catalog search across skills + plugin packages.
Query params:
q(required): query stringlimit(optional): integer (1–100)family(optional):skill,code-plugin, orbundle-pluginchannel(optional):official,community, orprivateisOfficial(optional):trueorfalseexecutesCode(optional):trueorfalsecapabilityTag(optional): capability filter for plugin packagestarget/hostTarget,os,arch,libc,requiresBrowser,requiresDesktop,requiresNativeDeps,requiresExternalService,requiresBinary,requiresOsPermission,externalService,binary, andosPermissionare accepted as shorthands for common capability tagsartifactKind(optional):legacy-zipornpm-packnpmMirror(optional):true/1to search ClawPack-backed package versions available through the npm mirror
- Anonymous callers only see public package channels.
- Authenticated callers can search private packages for publishers they belong to.
channel=privateonly returns packages the authenticated caller can read.- Artifact filters are backed by indexed capability tags:
artifact:legacy-zip,artifact:npm-pack, andnpm-mirror:available.
GET /api/v1/packages/{name}
Returns package detail metadata.
Notes:
- Skills can also resolve through this route in the unified catalog.
- Private packages return
404unless the caller can read the owning publisher.
DELETE /api/v1/packages/{name}
Soft-deletes a package and all releases.
Notes:
- Requires an API token for the package owner, an org publisher owner/admin, platform moderator, or platform admin.
GET /api/v1/packages/{name}/versions
Returns version history.
Query params:
limit(optional): integer (1–100)cursor(optional): pagination cursor
- Private packages return
404unless the caller can read the owning publisher.
GET /api/v1/packages/{name}/versions/{version}
Returns one package version, including file metadata, compatibility,
capabilities, verification, artifact metadata, and scan data.
Notes:
version.artifact.kindislegacy-zipfor old-world package archives ornpm-packfor ClawPack-backed releases.- ClawPack releases include npm-compatible
npmIntegrity,npmShasum, andnpmTarballNamefields. version.sha256hash,version.vtAnalysis,version.llmAnalysis, andversion.staticScanare included when scan data exists.- Private packages return
404unless the caller can read the owning publisher.
GET /api/v1/packages/{name}/versions/{version}/artifact
Returns the explicit artifact resolver metadata for a package version.
Notes:
- Legacy package versions return a
legacy-zipartifact and a legacy ZIPdownloadUrl. - ClawPack versions return an
npm-packartifact, npm integrity fields, atarballUrl, and the legacy ZIP compatibility URL. - This is the OpenClaw resolver surface; it avoids guessing archive format from a shared URL.
GET /api/v1/packages/{name}/versions/{version}/artifact/download
Downloads the version artifact through the explicit resolver path.
Notes:
- ClawPack versions stream the exact uploaded npm-pack
.tgzbytes. - Legacy ZIP versions redirect to
/api/v1/packages/{name}/download?version=. - Uses the download rate bucket.
GET /api/v1/packages/{name}/readiness
Returns computed readiness for future OpenClaw consumption.
Readiness checks cover:
- official channel status
- latest version availability
- ClawPack npm-pack artifact availability
- artifact digest
- source repo and commit provenance
- OpenClaw compatibility metadata
- host targets
- scan state
GET /api/v1/packages/migrations
Moderator endpoint for listing official OpenClaw plugin migration rows.
Auth:
- Requires an API token for a moderator or admin user.
phase(optional):planned,published,clawpack-ready,legacy-zip-only,metadata-ready,blocked,ready-for-openclaw, orall(default).limit(optional): integer (1-100)cursor(optional): pagination cursor
POST /api/v1/packages/migrations
Admin endpoint for creating or updating an official plugin migration row.
Auth:
- Requires an API token for an admin user.
bundledPluginIdis normalized to lowercase and is the stable upsert key.packageNameis npm-name normalized; the package can be missing for planned migrations.- This tracks migration readiness only. It does not mutate OpenClaw or generate ClawPacks.
GET /api/v1/packages/moderation/queue
Moderator/admin endpoint for package release review queues.
Auth:
- Requires an API token for a moderator or admin user.
status(optional):open(default),blocked,manual, oralllimit(optional): integer (1-100)cursor(optional): pagination cursor
open: suspicious, malicious, pending, quarantined, revoked, or reported releases.blocked: quarantined, revoked, or malicious releases.manual: any release with a manual moderation override.all: any release with a manual override, non-clean scan state, or package report.
POST /api/v1/packages/{name}/report
Report a package for moderator review. Reports are package-level, optionally
linked to a version. They feed the moderation queue but do not auto-hide or
block downloads by themselves; moderators should use release moderation to
approve, quarantine, or revoke artifacts.
Auth:
- Requires an API token.
POST /api/v1/packages/{name}/appeal
Package owner/publisher endpoint for appealing moderation on a release.
Auth:
- Requires an API token for the package owner or publisher member.
GET /api/v1/packages/appeals
Moderator/admin endpoint for package appeal intake.
Auth:
- Requires an API token for a moderator or admin user.
status(optional):open(default),accepted,rejected, oralllimit(optional): integer (1-100)cursor(optional): pagination cursor
POST /api/v1/packages/appeals/{appealId}/resolve
Moderator/admin endpoint for accepting, rejecting, or reopening an appeal.
Request:
note is required for accepted and rejected; it may be omitted when
setting status back to open. Pass finalAction: "approve" with an accepted
appeal to approve the affected release in the same auditable workflow.
Response:
GET /api/v1/packages/reports
Moderator/admin endpoint for package report intake.
Auth:
- Requires an API token for a moderator or admin user.
status(optional):open(default),confirmed,dismissed, oralllimit(optional): integer (1-100)cursor(optional): pagination cursor
GET /api/v1/packages/{name}/moderation
Owner/moderator endpoint for package moderation visibility.
Auth:
- Requires an API token for the package owner, publisher member, moderator, or admin user.
POST /api/v1/packages/reports/{reportId}/triage
Moderator/admin endpoint for resolving or reopening package reports.
Request:
note is required for confirmed and dismissed; it may be omitted when
setting status back to open. Pass finalAction: "quarantine" or
finalAction: "revoke" with a confirmed report to apply release moderation in the
same auditable workflow.
Response:
POST /api/v1/packages/{name}/versions/{version}/moderation
Moderator/admin endpoint for package release review.
Request:
approved: manually reviewed and allowed.quarantined: blocked pending follow-up.revoked: blocked after a release was previously trusted.
403 from artifact download routes.
Every change writes an audit log entry.
POST /api/v1/packages/backfill/artifacts
Admin-only maintenance endpoint for labeling older package releases with
explicit artifact-kind metadata.
Request body:
- Defaults to dry-run.
- Releases without ClawPack storage are labeled
legacy-zip. - Existing ClawPack-backed rows missing
artifactKindare repaired asnpm-pack. - This does not generate ClawPacks or mutate artifact bytes.
GET /api/v1/packages/{name}/file
Returns raw text content for a package file.
Query params:
path(required)version(optional)tag(optional)
- Defaults to the latest release.
- Uses the read rate bucket, not the download bucket.
- Binary files return
415. - File size limit: 200KB.
- Pending VirusTotal scans do not block reads; malicious releases may still be withheld elsewhere.
- Private packages return
404unless the caller can read the owning publisher.
GET /api/v1/packages/{name}/download
Downloads the legacy deterministic ZIP archive for a package release.
Query params:
version(optional)tag(optional)
- Defaults to the latest release.
- Skills redirect to
GET /api/v1/download. - Plugin/package archives are zip files with a
package/root so old OpenClaw clients keep working. - This route stays ZIP-only. It does not stream ClawPack
.tgzfiles. - Responses include
ETag,Digest,X-ClawHub-Artifact-Type, andX-ClawHub-Artifact-Sha256headers for resolver integrity checks. - Registry-only metadata is not injected into the downloaded archive.
- Pending VirusTotal scans do not block downloads; malicious releases return
403. - Private packages return
404unless the caller is the owner.
GET /api/npm/{package}
Returns an npm-compatible packument for ClawPack-backed package versions.
Notes:
- Only versions with uploaded ClawPack npm-pack tarballs are listed.
- Legacy ZIP-only versions are intentionally omitted.
dist.tarball,dist.integrity, anddist.shasumuse npm-compatible fields so users can point npm at the mirror if they choose.- Scoped package packuments support both
/api/npm/@scope/nameand npm’s encoded/api/npm/@scope%2Fnamerequest path.
GET /api/npm/{package}/-/{tarball}.tgz
Streams the exact uploaded ClawPack tarball bytes for npm mirror clients.
Notes:
- Uses the download rate bucket.
- Download headers include ClawHub SHA-256 plus npm integrity/shasum metadata.
- Moderation and private package access checks still apply.
GET /api/v1/resolve
Used by the CLI to map a local fingerprint to a known version.
Query params:
slug(required)hash(required): 64-char hex sha256 of the bundle fingerprint
GET /api/v1/download
Downloads a zip of a skill version.
Query params:
slug(required)version(optional): semver stringtag(optional): tag name (e.g.latest)
- If neither
versionnortagis provided, the latest version is used. - Soft-deleted versions return
410. - Download stats are counted as unique identities per hour (
userIdwhen API token is valid, otherwise IP).
Auth endpoints (Bearer token)
All endpoints require:GET /api/v1/whoami
Validates token and returns the user handle.
POST /api/v1/skills
Publishes a new version.
- Preferred:
multipart/form-datawithpayloadJSON +files[]blobs. - JSON body with
files(storageId-based) is also accepted. - Optional payload field:
ownerHandle. When present, the API resolves that publisher server-side and requires the actor to have publisher access.
POST /api/v1/packages
Publishes a code-plugin or bundle-plugin release.
- Requires Bearer token auth.
- Preferred:
multipart/form-datawithpayloadJSON +files[]blobs. - JSON body with
files(storageId-based) is also accepted. - Optional payload field:
ownerHandle. When present, only admins may publish on behalf of that owner.
familymust becode-pluginorbundle-plugin.- Plugin packages require
openclaw.plugin.json. ClawPack.tgzuploads must contain it atpackage/openclaw.plugin.json. - Code plugins require
package.json, source repo metadata, source commit metadata, config schema metadata,openclaw.compat.pluginApi, andopenclaw.build.openclawVersion. openclaw.hostTargetsandopenclaw.environmentare optional metadata.- Only trusted publishers may publish to the
officialchannel. - On-behalf publishes still validate official-channel eligibility against the target owner account.
DELETE /api/v1/skills/{slug} / POST /api/v1/skills/{slug}/undelete
Soft-delete / restore a skill (owner, moderator, or admin).
Optional JSON body:
reason is stored as the skill moderation note and copied into the audit log.
Status codes:
200: ok401: unauthorized403: forbidden404: skill/user not found500: internal server error
POST /api/v1/users/publisher
Admin-only. Ensures an org publisher exists for a handle. If the handle still points at a
legacy shared user/personal publisher, the endpoint migrates it into an org publisher first.
- Body:
{ "handle": "openclaw", "displayName": "OpenClaw", "trusted": true } - Response:
{ "ok": true, "publisherId": "...", "handle": "openclaw", "created": true, "migrated": false, "trusted": true }
POST /api/v1/users/reserve
Admin-only. Reserves root slugs and package names for a rightful owner without publishing a
release. Package names become private placeholder packages with no release rows, so the same
owner can later publish the real code-plugin or bundle-plugin release into that name.
- Body:
{ "handle": "openclaw", "slugs": ["diffs"], "packageNames": ["@openclaw/diffs"], "reason": "reserved for official OpenClaw plugin" } - Response:
{ "ok": true, "succeeded": 2, "failed": 0, "results": [{ "kind": "slug", "name": "diffs", "ok": true, "action": "reserved" }] }
Owner slug management endpoints
POST /api/v1/skills/{slug}/rename- Body:
{ "newSlug": "new-canonical-slug" } - Response:
{ "ok": true, "slug": "new-canonical-slug", "previousSlug": "old-slug" }
- Body:
POST /api/v1/skills/{slug}/merge- Body:
{ "targetSlug": "canonical-target-slug" } - Response:
{ "ok": true, "sourceSlug": "old-slug", "targetSlug": "canonical-target-slug" }
- Body:
- Both endpoints require API token auth and only work for the skill owner.
renamepreserves the previous slug as a redirect alias.mergehides the source listing and redirects the source slug to the target listing.
Transfer ownership endpoints
POST /api/v1/skills/{slug}/transfer- Body:
{ "toUserHandle": "target_handle", "message": "optional" } - Response:
{ "ok": true, "transferId": "skillOwnershipTransfers:...", "toUserHandle": "target_handle", "expiresAt": 1730000000000 }
- Body:
POST /api/v1/skills/{slug}/transfer/acceptPOST /api/v1/skills/{slug}/transfer/rejectPOST /api/v1/skills/{slug}/transfer/cancel- Response (accept/reject/cancel):
{ "ok": true, "skillSlug": "demo-skill?" }
- Response (accept/reject/cancel):
GET /api/v1/transfers/incomingGET /api/v1/transfers/outgoing- Response shape:
{ "transfers": [{ "_id": "...", "skill": { "slug": "demo", "displayName": "Demo" }, "fromUser"|"toUser": { "handle": "..." }, "message": "...", "requestedAt": 0, "expiresAt": 0 }] }
- Response shape:
POST /api/v1/users/ban
Ban a user and hard-delete owned skills (moderator/admin only).
Body:
POST /api/v1/users/unban
Unban a user and restore eligible skills (admin only).
Body:
POST /api/v1/users/role
Change a user role (admin only).
Body:
GET /api/v1/users
List or search users (admin only).
Query params:
q(optional): search queryquery(optional): alias forqlimit(optional): max results (default 20, max 200)
POST /api/v1/stars/{slug} / DELETE /api/v1/stars/{slug}
Add/remove a star (highlights). Both endpoints are idempotent.
Responses:
Legacy CLI endpoints (deprecated)
Still supported for older CLI versions:GET /api/cli/whoamiPOST /api/cli/upload-urlPOST /api/cli/publishPOST /api/cli/telemetry/syncPOST /api/cli/skill/deletePOST /api/cli/skill/undelete
DEPRECATIONS.md for removal plan.
Registry discovery (/.well-known/clawhub.json)
The CLI can discover registry/auth settings from the site:
/.well-known/clawhub.json(JSON, preferred)/.well-known/clawdhub.json(legacy)
CLAWHUB_REGISTRY explicitly; legacy CLAWDHUB_REGISTRY).