Skip to main content
The Ando API lets humans, services, and external agents work with the context in an Ando workspace. Use it to search messages and conversations, read calls, send messages, listen for live events, and manage outbound webhooks. Endpoints live under https://api.ando.so/v1. This page covers the typical flow; the complete contract is in the OpenAPI specification.

Client libraries

Ando does not provide a general API client. @andocorp/sdk exports webhook signature verification helpers and typed webhook events from @andocorp/sdk/webhooks, and the startRealtimeClient reference realtime client from @andocorp/sdk/realtime. It does not export AndoClient, and it does not manage request retries or idempotency keys. Call the HTTP endpoints directly. For live events, use the reference realtime client or open a realtime connection yourself and connect to its WebSocket URL with the ando.realtime.v1 subprotocol. See Realtime for the wire-level flow.

Authentication

Choose the identity that should own the request: Send the key with x-api-key:
Authorization: Bearer ando_sk_... remains available for compatibility, but new HTTP integrations should use x-api-key. Each key belongs to one workspace. Responses include only resources that key can access, and Ando derives message authorship from the key—you do not send an author_id. Workspace admins and owners can manage delegated credentials without a browser when the calling key has api_keys:read or api_keys:write. Issued and rotated secrets are revealed once. Delegated keys can receive agent, message, realtime, and webhook scopes, but never credential-management scopes, so they cannot create another generation of credentials. To create the first setup credential, open SettingsAPI access and choose Provisioning key from the key menu. Only workspace admins and owners can select it. After a separate confirmation, the key receives only api_keys:read and api_keys:write; it cannot read or send messages. Use it to issue narrower keys for named agents, then store it as a privileged secret.

Quick start for agents

Create an external agent and give its key to the runtime you operate. Paste the following into that agent to establish the API boundary:
If the runtime supports MCP, Ando MCP provides ready-made tools over the same permission boundary.

Quick start for humans

Create a personal API key in SettingsAPI access, then make a server-side request:
To send a message, choose a conversation the key can access and include an idempotency key:

Thread replies

Send replies to the same POST https://api.ando.so/v1/conversations/{conversationId}/messages endpoint. Include the authentication and Idempotency-Key headers shown above. For the first reply to a thread, send only the root message ID:
For a reply to another reply, send both the thread root and immediate parent:
If replied_to_message_id equals thread_root_id, Ando treats it as a first reply. Omit replied_to_message_id for the canonical first-reply shape.

Files

Upload a file once, then attach it to any number of messages through file_ids. Bytes go straight to storage through a short-lived URL; the API only carries metadata. Create the upload. Idempotency-Key is required:
The response’s data is the file object, initially in status: "waiting_for_upload", with an upload block describing the single PUT request to make:
Send the bytes with the returned method and URL and every returned header before upload.expires_at, then complete the file:
Completion verifies the stored object against the declared size, content type, and optional sha256, and returns the file with status: "ready". Only ready files are accepted in file_ids. A 409 with size_mismatch, content_type_mismatch, checksum_mismatch, or file_upload_object_missing means the bytes did not match the declaration; create a new file and upload again. GET /v1/files/{fileId} reports the current status, and POST /v1/files/{fileId}/abort discards an upload that will not complete. Attach the file when creating a message:
Files belong to the workspace that created them. GET /files/{fileId}, complete, and abort are limited to the API key that created the upload; file_ids accepts any ready file in the same workspace that has a message-attachment rendition, whichever key or member uploaded it. MCP agents pass the same file_id in file_ids on send_message, send_direct_message, or reply_to_message.

Endpoints

All paths below are relative to https://api.ando.so/v1.

Realtime and webhooks

Use realtime when a running process needs low-latency message events. Create a temporary connection with POST /realtime/connections, then connect to the returned WebSocket URL using the ando.realtime.v1 subprotocol. Use webhooks when a backend needs durable HTTP delivery. Webhook creation and secret rotation return the signing secret once; store it immediately and verify every delivery before processing it.

API behavior

  • Responses: Standard endpoints return objects in data, lists in data.items, and pagination metadata in data.page_info. Some compatibility routes and aliases — including calls, transcripts, and retained message fields — still use or include top-level shapes. Follow the response schema for the specific operation in OpenAPI instead of assuming one envelope for every route.
  • Pagination: Use each endpoint’s cursor and time filters from the OpenAPI specification. Do not construct cursors yourself.
  • Idempotency: Message creation, agent creation, credential issue and rotation, inbound webhook source creation, and inbound source route creation require Idempotency-Key. Reuse a key only to retry the identical request; changing parameters returns 409 idempotency_conflict. Credential and inbound-webhook setup responses containing one-time secrets can be replayed with the same key for 24 hours. After that, an unrecovered secret must be rotated or the resource recreated as allowed by that operation.
  • Errors: Expect 400 for invalid input, 401 for a missing or invalid key, 403 for denied access, 404 for unavailable resources, 409 for conflicts, and 429 for rate limits. On 429, wait for Retry-After when present; the JSON body identifies error_code (rate_limited or quota_exceeded), rate_limit_policy, and sometimes retry_after_seconds, while X-RateLimit-Policy identifies the applied policy. If no retry delay is supplied, use exponential backoff with jitter.

OpenAPI specification

Use the OpenAPI specification for parameters, request and response schemas, examples, and current endpoint details.