The Skillset REST API is a JSON over HTTP interface that backs the web interface, CLI, and MCP server. Every endpoint lives underDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/org-quicko/skillset/llms.txt
Use this file to discover all available pages before exploring further.
<PUBLIC_URL>/api, where PUBLIC_URL is the value you set in your Registry’s environment. This page explains the conventions that apply to every route: how to authenticate, what a paginated list looks like, and how errors are shaped.
Base URL
All endpoints are relative to your Registry’s origin:PUBLIC_URL defaults to http://localhost:3000, so the base URL is:
Authentication
- No auth needed
- Bearer Token
Catalog reads require no authentication. Any anonymous HTTP client can call:
GET /api/resources— browse the catalogGET /api/resources/stats— hero countsGET /api/resources/:kind/by-name/:name— fetch a Resource by nameGET /api/resources/:id— fetch a Resource by idGET /api/resources/:id/installs/trend— install trendGET /api/resources/:id/files— list Artifact filesGET /api/resources/:id/files/:path— read one Artifact fileGET /api/resources/:id/artifact— download the zipGET /api/tags— list TagsGET /api/auth/providers— list enabled Identity Providers
Role requirements
Every authenticated endpoint checks the caller’s role before executing:| Role | Can do |
|---|---|
| Reader | Browse and install — catalog reads need no auth at all |
| Writer | Publish, import, and manage own Tokens and Connections |
| Admin | Everything a Writer can do, plus manage Users, Tags, Integrations, and Submissions |
| Superadmin | First user; permanent Admin whose account cannot be altered |
A user whose generated password has not yet been changed is blocked from all endpoints except
GET /api/users/me and PUT /api/users/me/password. Both of those endpoints work regardless of must_change_password.Request format
All request bodies must be JSON. Include the content-type header on every request that carries a body:Pagination
List endpoints that return many rows accept apage query parameter and respond with a pagination envelope. Some endpoints also accept page_size to control the number of results per page; others use a fixed page size. See each endpoint’s documentation for the exact parameters accepted.
| Field | Type | Description |
|---|---|---|
items | array | The records for this page |
page | integer | The current page (1-based) |
page_size | integer | Records per page |
total | integer | Total matching records across all pages |
Error format
Every error response uses the same JSON envelope:field key is only present when the error is attributable to a specific request field (for example, a validation failure on email).
Common error codes
| Code | Status | When it occurs |
|---|---|---|
unauthenticated | 401 | No valid session or Token was presented |
forbidden | 403 | The caller’s role is too low for this action |
password_change_required | 403 | Generated password must be replaced before continuing |
validation_failed | 400 | A request field failed validation |
not_found | 404 | The requested resource does not exist |
ambiguous_name | 409 | A bare name matched Resources in more than one Namespace |
artifact_missing | 404 | The Resource exists but its Artifact was never uploaded |
artifact_too_large | 413 | The stored Artifact exceeds the allowed size |
email_taken | 409 | A User with that email already exists |
superadmin_protected | 409 | The Superadmin’s account cannot be changed or removed |
integration_in_use | 409 | An Integration cannot be deleted while Connections reference it |
integration_not_configured | 409 | No Integration exists for the requested Git Provider |
not_connected | 409 | The writer has no Connection for the requested provider |
tag_name_conflict | 409 | A Tag with that name already exists |
already_published | 409 | A Submission’s target (kind, namespace, name) is already in the Registry |
source_required | 400 | A Submission must include a source repository URL |
request_rejected | 4xx | The request was rejected by the framework (e.g. unsupported method or malformed body) |
internal_error | 500 | An unexpected server-side failure |
Rate limiting
Requests are rate-limited per client IP using a fixed window. The default limit is 600 requests per 60 seconds. Two endpoint groups have tighter per-path limits:| Path prefix | Limit |
|---|---|
/api/resources | 300 requests per 60 seconds |
/api/imports | 60 requests per 60 seconds |
TRUSTED_PROXY_IPS in your environment to the proxy’s address so the real client IP is read from X-Forwarded-For instead of the socket. Leaving it empty behind a proxy collapses all traffic into one shared rate-limit bucket.
When a limit is exceeded, the API responds with 429 rate_limited and a retry-after header indicating how many seconds to wait before retrying.
Endpoint groups
Resources
Publish, browse, download, and delete Resources. The core catalog API.
Tags
Browse the Tag catalog and rename Tags (admin).
Users
Manage accounts, roles, passwords, and personal Tokens.
Auth
Identity Provider list and the Better Auth session endpoints.
Imports
Read Skills from Git repositories through configured Integrations.
Integrations
Register and manage Git Provider app credentials (admin).
Connections
Grant the Registry personal access to your Git repositories.
Submissions
Submit community-sourced Resources and approve or reject them (admin).