API reference
The Catentio control-plane API is a REST API that uses JSON for both requests and responses. It's the same API the portal and the SDKs use; if you want to integrate Catentio directly without an SDK, this section covers everything you need.
Base URL
https://catent.io
The control plane is co-located with the portal in v1 (internal mode). API paths live under /v1/* on the same origin.
For self-hosted or non-canonical deployments, point your client at the deployment's portal URL — the API will be there.
Authentication
The control plane accepts three credential shapes, in this order of preference per request:
| Header | When to use it |
|---|---|
Authorization: Bearer <huudis-jwt> |
CLI / interactive scripts using OIDC device flow. |
Authorization: Bearer <cat_ak_...> |
Server-to-server with a static API key minted in the dashboard. |
x-catentio-session |
The portal's HMAC-signed session cookie. Browser-only; you generally won't set this manually. |
All three resolve to the same Principal server-side and the same single-user gate (in v1) applies regardless of which path you took.
See Authentication for the full recipe with worked examples for each.
Response envelope
Every successful API response is wrapped in the Forjio envelope:
{
"data": { /* the response payload */ },
"error": null,
"meta": {
"requestId": "req_01H...",
"timestamp": "2026-05-12T10:42:00Z"
}
}
List endpoints have a paginated variant:
{
"data": [ /* items */ ],
"error": null,
"meta": {
"requestId": "req_01H...",
"timestamp": "2026-05-12T10:42:00Z",
"page": {
"limit": 50,
"hasMore": true,
"nextCursor": "cur_xxx"
}
}
}
Errors keep the envelope shape but set error:
{
"data": null,
"error": {
"code": "VALIDATION_ERROR",
"message": "agent slug is required",
"field": "slug"
},
"meta": { "requestId": "...", "timestamp": "..." }
}
This envelope comes from @forjio/sdk/http and is identical across every Forjio product.
Resources
The API is organised by resource. Each resource has a CRUD-like surface plus action endpoints where the verb isn't list/get/create/delete.
| Resource | Path prefix | What it does |
|---|---|---|
| Workspaces | /v1/workspaces |
Tenants. |
| Agents | /v1/agents |
The agent roster + invoke. |
| Runs | /v1/runs |
Per-invocation history + cancel. |
| Projects | /v1/projects |
Pipeline-driven workflows. |
| Templates | /v1/templates |
Available project templates. |
| Tools | /v1/tools |
Per-agent tool budget. |
| Skills | /v1/skills |
Versioned agent playbooks. |
| Memory | /v1/memory |
RAG entries (OTP-gated mutations). |
| API keys | /v1/api-keys |
Static credentials. |
| Billing | /v1/billing |
Catalog, summary, subscribe. |
| Cost | /v1/cost |
Workspace-level rollups. |
| Integrations | /v1/integrations |
BYO credentials. |
| Webhooks | /v1/webhooks |
Outbound event delivery. |
| Scheduled jobs | /v1/scheduled-jobs |
Runtime cron. |
| Feature flags | /v1/feature-flags |
Runtime kill switches. |
| Files | /v1/files |
Run artifacts. |
| Output destinations | /v1/output-destinations |
Where agent outputs go. |
| Heartbeats | /v1/heartbeats |
Cron-triggered agent invocations. |
| System | /v1/system |
Health, info (some unauth). |
| Chat | /v1/chat |
The chat-bubble REPL backend. |
| Events | /v1/events |
Outbox events feed. |
The 25 namespaces are exposed identically across the Node, Python, and Go SDKs — same method names (modulo language casing), same arguments, same response shapes.
Idempotency
Mutating endpoints (POST, PATCH, DELETE) accept an Idempotency-Key header. Same key within 24 hours returns the same response — no duplicate operation.
Use idempotency keys for any operation that has side effects you don't want to double-fire: invoking an agent, creating a project, registering a webhook.
Rate limits
Default limits per workspace:
| Endpoint class | Limit |
|---|---|
| Read (GET) | 100 req/sec |
| Write (POST/PATCH/DELETE) | 20 req/sec |
| Agent invocations | 10 req/sec, with a 50-run burst |
Limits are returned in response headers:
X-RateLimit-LimitX-RateLimit-RemainingX-RateLimit-Reset
On exceeding the limit you get 429 Too Many Requests with a Retry-After header.
Webhooks
Catentio sends webhook events for state changes you care about: run.succeeded, project.paused, subtask.failed, and so on. Events are signed; you verify the signature before trusting the payload.
The /v1/webhooks endpoints let you register endpoints and view delivery history. Event payloads carry the full Forjio envelope.
OpenAPI spec
A machine-readable OpenAPI 3.0 spec lives in the catentio runtime repo — that's the wire-protocol source of truth, since the runtime is the one defining it. The control plane consumes the same spec.
Next
- API authentication — Bearer + API-key recipes.
- SDK overview — if you'd rather not call the REST API directly.
- Concepts — the data model the API exposes.