docs
API

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

ResourceWhat it holdsScopes
SignalsRaw 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
BeaconsRanked clusters of related signals. Reads take a key; promoting or editing a beacon is session-only.signals:read
SpecsSpec 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 versionsSnapshots of a spec, and restores from one.versions:read, versions:write
Spec sectionsReads inside one spec by heading, search or acceptance criteria, and open questions posted back.prd:read, prd:write
EventsThe event history of one signal, beacon, spec or pull request, including events on the items it flowed into.signals:read

Knowledge resources

ResourceWhat it holdsScopes
KnowledgeOne plain-English question against what nima knows about your product, answered in markdown.knowledge:read
CodeSearch indexed repositories, compute the blast radius of a change, and read the data model.knowledge:read

Watch resources

ResourceWhat it holdsScopes
WatchesSaved instructions that run when an event happens, the event-type catalog, and your inbox.subscriptions:read, subscriptions:write, inbox:read
Scheduled messagesOne-time reminders delivered to your own Slack DM.subscriptions:read, subscriptions:write

Operation resources

ResourceWhat it holdsScopes
OperationsAgent work on a spec or a task: start, read, steer, park, resume, cancel.documents:read, operations:write
Agent computeThe workspace opt-in, budgets and limits for hosted agent VMs.integrations:write

Outbound resources

ResourceWhat it holdsScopes
ActionsDrafts nima holds for an approver: list, read, approve, discard.actions:approve
Action policiesThe never, ask or auto rule per action kind, and which tracker projects count as internal.integrations:write
IdentitiesLinks between external accounts and workspace members.integrations:write, identities:write
WritersConnect the GitHub, Jira and Linear writers that let nima publish.integrations:write

Ingest and admin resources

ResourceWhat it holdsScopes
WebhooksInbound 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 settingsRead or change workspace switches such as triggersEnabled and dispatchEnabled.Signed-in session, no scope
OAuthToken exchange, revocation and userinfo, for an app acting for a nima user.Any

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"
}
StatuserrorWhat it means
400VALIDATION_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.
401TOKEN_INVALIDNo key, a malformed key, or one that expired or was revoked.
403INSUFFICIENT_PERMISSIONSThe 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.
404RESOURCE_NOT_FOUNDNo such id in this workspace. An id from another workspace looks the same as one that never existed.
429RATE_LIMITEDThe 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.

On this page