Skip to main content
Ando’s public API is for server-side integrations that need workspace context: search messages and workspace records, read conversation history, and create messages or replies with an API key.

API or SDK?

The API is the network contract. The SDK is a Node.js and TypeScript client that calls that same API. Both use the same API keys, permissions, rate limits, and workspace data. The SDK does not add endpoints or act as a separate backend. When the two differ, the generated endpoint reference describes what the server currently accepts. The stable, supported part of public API v1 is built around two jobs:
  • Find context: search messages, conversations, workspace members, and calls.
  • Work with messages: list, create, fetch, and reply to conversation messages.
Other endpoints exist for testing or older compatibility, but they are not the first surface new integrations should build on.

Get an API key

Start with Which key do I use? if you are choosing between a member key, third-party agent key, workspace or service key, MCP bearer setup, realtime ticket, or webhook signing secret. For a human-owned public API integration, create a member API key in Ando:
  1. Open Settings.
  2. Go to API keys.
  3. Create or copy an API key.
  4. Store it as a secret in your server-side environment.
Use Third party agents instead when you want messages to be attributed to an agent identity rather than a human workspace member. Use a workspace or service key when the integration should be owned by the workspace rather than one person.

Base URL and authentication

All public API v1 requests use this base URL:
Use x-api-key as the canonical auth header:
Bearer transport is still accepted for compatibility:
Do not use https://api.ando.so/api/v1 for public API v1 clients.

Resource model

The API is scoped to the workspace attached to the API key. Results only include workspace resources the key can access. Identity terms are narrower than storage table names: Some v1 names preserve compatibility spellings, such as /search/members, /members/{memberId}, MemberResult, and author_id. Treat these as workspace-member and message-author identifiers, not as a separate public resource model.

Stability levels

In this guide, stable means generally available: supported for production integrations and covered by the public API v1 compatibility promise. The endpoint reference includes the exact status for every operation.

Response envelopes

Successful object responses return the resource under data:
Search and list responses return items under data.items:
Some current v1 responses also include deprecated top-level compatibility aliases such as items or pageInfo. New clients should read data, data.items, and data.page_info.

Pagination

List and search routes accept limit plus cursor or time filters where the endpoint supports them. Page using the cursor returned in data.page_info:
Use before for older conversation messages. Use after and before filters on search routes when you need a time-bounded search.

Writes and idempotency

Message creation (POST /conversations/{conversationId}/messages) requires an Idempotency-Key header and replays idempotently. Reuse the same key only when retrying the same request body after a timeout or network failure. Use a new key for a distinct message.
Public API clients do not choose the author. Ando derives authorship from the API key or connected-agent identity. Task updates (POST /tasks/{taskId}/updates) accept an Idempotency-Key header but do not replay idempotently today. For concurrency protection, send the optional expected_state_version body field instead — a stale version returns 409. Other write routes do not use idempotency keys.

Errors

Most public v1 errors use a structured envelope:
Compatibility endpoints may return the older error, error_code, and missing_scopes shape. The endpoint reference shows the exact response schema. Start with the stable message workflow:
  1. Search messages with GET /search/messages.
  2. List recent conversation history with GET /conversations/{conversationId}/messages.
  3. Create a message with POST /conversations/{conversationId}/messages.
  4. Fetch the created message with GET /conversation-messages/{messageId}.
  5. Reply or inspect replies with the thread endpoints.
Follow the messaging quickstart for the copy-pasteable curl workflow, then use the endpoint reference for full schemas.