API overview
The nima REST API: base URL, credentials, a first call, and the map of every resource a key can reach.
The nima REST API is at https://api.getnima.io. It is the API behind every tool on nima's MCP server: a tool call is one of these routes, made with the caller's own bearer token. Anything an agent can do through nima, a script can do with curl.
Availability
On for every workspace. Individual resources carry their own availability note: outbound actions, watches and hosted agent compute each need a workspace setting or a grant on top of the API itself.
One credential covers most of it: a personal API key, sent as Authorization: Bearer. A key belongs to the workspace it was created in and acts as you inside it. Its scopes narrow your own permissions and never widen them, so a key cannot reach what your account cannot.
Make your first API call with a personal API key
Three steps take you from nothing to a signal read: create a key, check it, read something.
Create an API key for your first call
In nima, open Settings → API keys → New key. Name the key after where it will run. Two scopes are ticked for you, knowledge:read and signals:read; the other 11 sit under More scopes. Pick an expiry of 30, 90 or 365 days (the default is 90; there is no permanent key), and optionally a list of CIDR ranges the key may be used from. Then press Create key.
The key is shown once, at creation. Each member can hold at most 10 active keys per workspace. Field rules are in Create an API key.
export NIMA_API_KEY="nima_…"Check the credential with userinfo
GET /oauth/userinfo accepts a key with any scope, so it is the one call that can fail only for a credential reason.
curl -s https://api.getnima.io/oauth/userinfo \
-H "Authorization: Bearer $NIMA_API_KEY"{
"sub": "3f8a2c14-9d6b-4c2e-8a77-1b0d5e9f4c21",
"email": "you@example.com",
"isOnboarded": true,
"organizationId": "b71e5c08-2f49-4a6d-9c31-7e5a08d2b4f6",
"orgRole": "admin"
}organizationId is the workspace the key is pinned to; every other call with this key reads and writes there and nowhere else. isOnboarded turns true once you complete the first onboarding step (setting up your workspace) in the admin panel. orgRole is null if you have left the workspace; userinfo still answers, and every other call then answers 403.
Read a signal list
The signals:read scope from the first step is enough.
curl -s "https://api.getnima.io/v1/signals?limit=3" \
-H "Authorization: Bearer $NIMA_API_KEY"{
"data": [
{
"id": "c04b9a71-5f3e-4d18-9b62-8a7c1e0d5f33",
"source": "slack",
"preview": "Bulk export times out on workspaces over 40k rows.",
"status": "ready",
"classification": "bug",
"impact": "high",
"createdAt": "2026-09-19T09:14:02.401Z"
}
],
"meta": { "page": 1, "pageSize": 3, "totalItems": 412, "totalPages": 138 }
}Trimmed to the fields you reach for first. Signals has the whole object.
API resource map
Every resource page lists its routes with the scope each one needs and the MCP tool that calls it. Ids are UUIDs, timestamps are ISO 8601 in UTC (a spec's startDate and dueDate are plain YYYY-MM-DD dates), and responses are JSON, with two exceptions: the knowledge graph answers in text/markdown, and an operation's event feed (GET /v1/operations/{id}/events) is a text/event-stream stream.
Pipeline resources
| Resource | What it holds | Scopes |
|---|---|---|
| Signals | Raw evidence. File one, search them, read one in full, or fetch the original thread, issue or note behind it. | signals:read, signals:write, sources:read |
| Beacons | Ranked clusters of related signals. Reads take a key; promoting or editing a beacon is session-only. | signals:read |
| Specs | Spec documents. List, read as markdown, write markdown back, promote to a ticket, check delivery, dispatch to an agent. | documents:read, documents:write, operations:write |
| Spec versions | Snapshots of a spec, and restores from one. | versions:read, versions:write |
| Spec sections | Reads inside one spec by heading, search or acceptance criteria, and open questions posted back. | prd:read, prd:write |
| Events | The event history of one signal, beacon, spec or pull request, including events on the items it flowed into. | signals:read |
Knowledge resources
| Resource | What it holds | Scopes |
|---|---|---|
| Knowledge | One plain-English question against what nima knows about your product, answered in markdown. | knowledge:read |
| Code | Search indexed repositories, compute the blast radius of a change, and read the data model. | knowledge:read |
Watch resources
| Resource | What it holds | Scopes |
|---|---|---|
| Watches | Saved instructions that run when an event happens, the event-type catalog, and your inbox. | subscriptions:read, subscriptions:write, inbox:read |
| Scheduled messages | One-time reminders delivered to your own Slack DM. | subscriptions:read, subscriptions:write |
Operation resources
| Resource | What it holds | Scopes |
|---|---|---|
| Operations | Agent work on a spec or a task: start, read, steer, park, resume, cancel. | documents:read, operations:write |
| Agent compute | The workspace opt-in, budgets and limits for hosted agent VMs. | integrations:write |
Outbound resources
| Resource | What it holds | Scopes |
|---|---|---|
| Actions | Drafts nima holds for an approver: list, read, approve, discard. | actions:approve |
| Action policies | The never, ask or auto rule per action kind, and which tracker projects count as internal. | integrations:write |
| Identities | Links between external accounts and workspace members. | integrations:write, identities:write |
| Writers | Connect the GitHub, Jira and Linear writers that let nima publish. | integrations:write |
Ingest and admin resources
| Resource | What it holds | Scopes |
|---|---|---|
| Webhooks | Inbound signal ingest from anything that can POST JSON. Managing a sender is session-only. | Ingest: the endpoint's own secret. Managing a sender: a signed-in session |
| Workspace settings | Read or change workspace switches such as triggersEnabled and dispatchEnabled. | Signed-in session, no scope |
| OAuth | Token exchange, revocation and userinfo, for an app acting for a nima user. | Any |
Authentication
Keys, expiry, rotation, IP restrictions, and what a key can never do.
Scopes
All 17 scopes, what each unlocks, and who can grant it.
Errors
Every status and error code, and what is worth retrying.
Session-only API routes
Session-only routes take the signed-in browser session of a workspace member and never a personal API key or OAuth token; called with a key, they answer 403 INSUFFICIENT_PERMISSIONS. They carry no scope because they were built for a signed-in session, and they cover credentials and workspace administration: creating, rotating and revoking API keys (/v1/api-keys), managing webhook senders (/v1/signal-webhooks), reading and changing workspace settings (/organizations/settings), members and invitations, and promoting or editing a beacon (/v1/beacons/{id}/promote, PATCH /v1/beacons/{id}).
No key can create, list, rotate or revoke another key. Two scopes on the map above, operations:write and integrations:write, cannot be put on a key from Settings; an owner or admin mints them in Slack with /nima mcp-key operations or /nima mcp-key integrations. The scopes actions:approve and identities:write cannot be minted by any route today, so the routes that need only them (the action routes and POST /v1/identities/link-me) answer only to a signed-in session. Scopes has the detail.
Everything else the admin panel calls is internal and changes without notice. Treat anything you find in a browser network tab as private.
API error envelope in brief
Every error uses one envelope: statusCode, error, message, timestamp and path, plus details on a 4xx that has any and an incidentId on a 5xx. The X-Request-Id response header carries the same id on every response.
{
"statusCode": 403,
"error": "INSUFFICIENT_PERMISSIONS",
"message": "OAuth token scopes do not cover this endpoint",
"details": { "requiredScopes": ["signals:read"] },
"timestamp": "2026-09-19T09:14:02.401Z",
"path": "/v1/signals"
}| Status | error | What it means |
|---|---|---|
400 | VALIDATION_ERROR or "Bad Request" | A value failed validation. Most body and query DTOs answer "Bad Request" with no per-field reason, so check the value against the operation's table; routes validated by schema answer VALIDATION_ERROR, often with details.issues naming the field. |
401 | TOKEN_INVALID | No key, a malformed key, or one that expired or was revoked. |
403 | INSUFFICIENT_PERMISSIONS | The key's scopes do not cover the route (details.requiredScopes names them), the route is session-only, the workspace's plan lacks the feature (details.feature names it), or you are no longer an active member. |
404 | RESOURCE_NOT_FOUND | No such id in this workspace. An id from another workspace looks the same as one that never existed. |
429 | RATE_LIMITED | The default budget is 100 requests a minute, keyed on the calling address, so several keys behind one address share a bucket. |
Errors lists every code and which are worth retrying, and Rate limits has the tiers.
A parameter a route does not read is ignored, not rejected
Signals and beacons page with page and limit. Specs and operations page with page and pageSize. Send pageSize to signals and the call still answers 200, with the default 20 rows and no warning. If a page is longer than you asked for, read meta.pageSize back. Pagination covers the 3,000-row ceiling.
API stability and paths
API paths are not uniform, and one does not predict the next. These sit under /v1: signals, beacons, events, knowledge, code search, watches and the inbox, scheduled messages, operations, agent compute, webhooks, API keys and the outbound resources. Specs and spec versions are at /documents, spec sections at /prd, workspace settings at /organizations, and the OAuth endpoints at /oauth, with no prefix. Spec dispatch is the mixed case: POST /v1/documents/{id}/dispatch carries the /v1 prefix while the rest of the spec routes do not.
/v1 is a string those routes were written with rather than a version you can negotiate. There is no second version, no version header, and no path whose meaning changes with one. Take every path on this site literally; Conventions lists the base paths.
An OpenAPI 3.1 document covering the key-reachable operations on this site (not the OAuth authorization flow) is published at docs.getnima.io/openapi.json; import it into Postman, Bruno or a client generator.
Sentry
Connect Sentry so unresolved issues from every organization the authorizing user belongs to become signals.
Authentication
The credentials the nima API accepts (personal API keys, Slack-issued headless keys, OAuth access tokens), how each is created and expires, and the rules no credential breaks.