What it is
This is the reference for all endpoints available to anyone integrating with Symphony using an API key. Each endpoint lists the method, path, parameters, a sample call, and the response format. If it’s your first time, start with Connect via API. To understand how to combine these endpoints in a real project, see Building projects with the API.1. Before you start
Base URL
Headers
All endpoints on this page, except those in section 10. Service status, require:
Don’t send cookies or a CSRF token. They aren’t needed with an API key.
What your key can do
The key has exactly the same access as your account: the same models, agents, knowledge bases, flows, permissions, and usage limit. If you can’t do something in the interface, you can’t do it through the API either. Some actions depend on permissions granted by the company administrator (for example, creating knowledge bases). Check yours withGET /api/v1/users/permissions.
Conventions
- Dates are integers in epoch time (seconds since 01/01/1970, UTC), unless stated otherwise.
- IDs are strings. Copy them exactly as returned.
- Cursor pagination: list endpoints return
{ "items": [...], "next_cursor": "..." }. To fetch the next page, repeat the call with?cursor=<next_cursor>. Whennext_cursorisnull, you’re done.limitaccepts 1 to 200. - Errors follow a single format, described in Errors and limits.
2. Account and API key
GET /api/v1/auths/api_key
Returns your current API key.
404 if you haven’t generated a key yet.
POST /api/v1/auths/api_key
Generates a new key. The previous key stops working immediately.
403 if key generation is disabled in the environment.
DELETE /api/v1/auths/api_key
Revokes your key. Returns true. After that, no call with it works.
Generating and revoking are usually done in the interface (Settings → Account → API keys). These endpoints exist for anyone who needs to automate rotation.
GET /api/v1/auths/
Returns the data of the account that owns the key.
The response also includes the
token, token_type, and expires_at fields. They’re for the browser session and aren’t needed when using an API key.GET /api/v1/users/permissions
Returns what your account can do.
GET /api/v1/consumption/me
Returns your usage for the month and the status of your limit.
With
status at reached or blocked, chat calls return 402. Use this endpoint before large batches.
3. Models and agents
GET /api/models
Lists the models and agents your account can use in the company given in X-Enterprise-Id.
- The
idis the value that goes in the chatmodelfield. - Items with
info.base_model_idare agents: they come with prompt, bases, and tools already configured on the platform. - The list is already filtered to what you can use. Disabled models or ones not shared with you don’t appear.
4. Chat
POST /api/chat/completions
Sends messages to a model or agent and receives the response. Compatible with OpenAI’s chat completions API.
Required fields
Optional fields: generation
Optional fields: tools and context
Optional fields: platform history
Example
200)
"stream": true, the response arrives as data: {...} lines, each with a chunk in choices[0].delta.content, ending with data: [DONE]. An error can arrive inside the stream, after the 200 OK. See section 6 of Building projects with the API.
Automatic history. If you send a chat_id and no message with role: "assistant", Symphony retrieves that conversation’s saved history and puts it before your message. This way you keep a long conversation going by sending only the new question. If your array has any assistant message, Symphony assumes you manage the history and injects nothing.
Errors specific to this endpoint
POST /api/responses
Version compatible with OpenAI’s Responses API, for tools that only speak that format. Accepts input (text or list) instead of messages and streams in the Responses API format.
For new integrations, use
POST /api/chat/completions. This endpoint exists only for compatibility.5. Files
POST /api/v1/files/
Uploads a file. The body is multipart/form-data, with the file in the file field.
GET /api/v1/files/{id}
Returns the file data, including processing status.
Large or scanned PDFs can take a few minutes. Poll at intervals (for example, every 3 seconds) with a maximum wait time.
GET /api/v1/files/
Lists your files.
GET /api/v1/files/search
Searches files by name.
GET /api/v1/files/{id}/content
Downloads the original file.
DELETE /api/v1/files/{id}
Deletes the file. Returns { "message": "File deleted successfully" }. Only the owner, or someone with write permission, can delete it.
6. Knowledge bases
A knowledge base groups several files so the model looks up only the relevant parts for each question. To use a base in chat, send"files": [{ "type": "collection", "id": "<base id>" }], or use an agent that already has the base configured.
Full flow through the API:
1
Create the base
POST /api/v1/knowledge/create2
Upload each file
POST /api/v1/files/ and wait for the ready status.3
Add the files to the base
POST /api/v1/knowledge/{id}/file/add4
Use it in chat
files: [{ "type": "collection", "id": "..." }]GET /api/v1/knowledge/list/compact
Lists the bases you can see, with cursor pagination.
can_write indicates whether you can change the base.
GET /api/v1/knowledge/count
Returns the total number of bases you can see: { "total": 8 }.
GET /api/v1/knowledge/{id}
Returns the full base, with the list of files (files).
POST /api/v1/knowledge/create
Creates a base. Requires the workspace.knowledge permission. Without it, returns 401.
Returns the created base, with its
id.
POST /api/v1/knowledge/{id}/update
Changes name, description, or access. Same body as create. Requires write permission on the base.
POST /api/v1/knowledge/{id}/file/add
Adds an already uploaded file (with ready status) to the base.
POST /api/v1/knowledge/{id}/files/batch/add
Adds several files at once.
POST /api/v1/knowledge/{id}/file/remove
Removes a file from the base.
DELETE /api/v1/knowledge/{id}/delete
Deletes the base. The files still exist in /api/v1/files/. Returns true.
7. Conversations
By default, chat calls aren’t saved. Use these endpoints when you want your project’s conversations to stay in the platform’s history, where they can be audited or continued in the interface.POST /api/v1/chats/new
Creates an empty conversation.
id and send it as chat_id in POST /api/chat/completions.
GET /api/v1/chats/list/cursor
Lists your conversations, from newest to oldest.
GET /api/v1/chats/search
Searches conversations by text.
Returns
[{ "id", "title", "created_at", "updated_at" }].
GET /api/v1/chats/{id}
Returns the full conversation, with all messages in chat.history.messages. Only works for your own conversations.
DELETE /api/v1/chats/{id}
Deletes the conversation. Returns true.
8. Flows (Workflows)
Flows are sequences of steps built in the Symphony interface (for example: read a document → summarize with an agent → classify). Through the API you list, run, and track the flows you have permission to use. How a run works: the run call responds right away with arun_id. The flow runs in the background, and you poll the result until it finishes.
GET /api/v1/workflows/list
Lists the flows you can use, with cursor pagination.
GET /api/v1/workflows/workflow?id={id}
Returns the full flow, including its steps (graph).
POST /api/v1/workflows/workflow/run?id={id}
Runs the flow. The body is optional and sets the input for the first step:
429 if your company has already started the maximum number of runs allowed in the last minute (currently 30). Wait a few seconds and try again.
GET /api/v1/workflows/runs/detail?run_id={run_id}
Returns the run, with the result of each step. This is the endpoint you poll until the run finishes.
GET /api/v1/workflows/workflow/runs?id={id}
Lists a flow’s runs, without step details.
POST /api/v1/workflows/runs/cancel?run_id={run_id}
Requests cancellation of a run in progress. Returns true. Only the person who started the run can cancel it.
9. Audio
POST /api/v1/audio/transcriptions
Transcribes audio to text. The body is multipart/form-data, with the audio in the file field.
- Accepted formats: MP3 (
audio/mpeg), WAV (audio/wav), OGG (audio/ogg), and M4A (audio/x-m4a). - Size: audio over 25 MB is compressed automatically. If it’s still over the limit, it returns
FILE_TOO_LARGE.
POST /api/v1/audio/speech
Converts text to speech. Returns the audio as MP3.
The voice model is set by your company’s configuration. Identical requests are served from cache and don’t count toward the limit.
GET /api/v1/audio/voices
Lists the available voices: { "voices": [{ "id": "alloy", "name": "alloy" }] }.
GET /api/v1/audio/models
Lists the available voice models: { "models": [...] }.
Limit: transcription and speech each accept up to 30 calls per minute per company. Above that, they return
429.10. Service status
These endpoints don’t require authentication.11. What’s not part of the public API
The endpoints below exist, but aren’t supported for integration. They may change or be removed without notice, or they require a profile that integration accounts don’t have:- Platform administration (
/api/v1/admin/..., management of users, companies, groups, models, and other people’s usage): requires an administrator profile and is done through the interface. - Password login and SSO (
/api/v1/auths/signin,/signup,/api/v1/auth/sso/...): use the API key. - Internal interface routes: screen settings, suggestions, banners, ratings, automatic title and tag generation, and
GET /api/config, which doesn’t accept an API key. - Direct access to AI providers (
/openai/...,/ollama/...): usePOST /api/chat/completions. - Direct image generation (
/api/v1/images/...): generate images through chat, withfeatures.image_generation: true. - Direct vector ingestion and search (
/api/v1/retrieval/...): use knowledge bases and the chatfilesfield. - Task management (
/api/tasks/...): to stop a streaming response, close the connection.