API Documentation
Hand-written guide to the most-used LiquidCortex REST endpoints. The generated OpenAPI reference below is the complete, always-current source.
Live reference
Every path, schema and enum on this page comes from that document. If the two disagree, the OpenAPI document wins.
Getting Started
The LiquidCortex API lets you list AI employees, chat with them, search your knowledge base, and run workflows from your own code.
Base URL
https://liquidcortex.ai/apiPaths below are shown relative to this base, so /employees/ means https://liquidcortex.ai/api/employees/. Some routes carry a /v1 segment; the exact path is shown on each endpoint.
Quick Start
1Get your API Key
Navigate to Developer Hub and create a new API key. Keep it secure - it grants full access to your account.
2Make your first request
curl https://liquidcortex.ai/api/employees/ \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"3Chat with an employee
curl -X POST https://liquidcortex.ai/api/chat/message \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"employee_id": "atlas",
"messages": [
{ "role": "user", "content": "Schedule a team standup for tomorrow at 10am" }
],
"stream": false
}'Authentication
The API declares a single security scheme, HTTPBearer. Send your key in the Authorization header of every request.
Request Header
Authorization: Bearer lc_live_sk_xxxxxxxxxxxxxxxxxxxxAPI Key Types
Prefix: lc_live_sk_
Use in production. Consumes credits.
Prefix: lc_test_sk_
Use for development. Free but rate-limited.
Key management endpoints
/keysCreate an API key. The full key is returned once, in this response only.
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Human-readable name for the key |
key_type | string | No | "live" or "test" (default: live) |
permissions | string[] | No | read, write, employees, knowledge, workflows (default: ["read", "write"]) |
/keysList your API keys (prefix only; the secret is never returned again).
/keys/{key_id}Revoke an API key.
Security Warning: Never expose API keys in client-side code, public repositories, or logs. Rotate keys immediately if compromised.
Employees
List the AI employees on the platform and read each one's role, department and specializations.
/employees/List all AI employees. Returns a JSON array (no wrapper object, no query parameters).
Response
[
{
"id": "atlas",
"name": "Atlas",
"role": "Executive Assistant",
"phase": "...",
"department": "...",
"tier": "...",
"specializations": ["..."],
"description": "..."
}
]Field list is EmployeeInfoResponse from the OpenAPI schema. Values shown as "..." vary per employee; call the endpoint for real data.
/employees/{employee_id}Get one employee by ID. Same EmployeeInfoResponse shape as the list.
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
employee_id | string | Yes | The employee ID (e.g., "atlas") |
Chat & Conversations
Send messages to AI employees and manage conversation history. One endpoint handles both streaming (Server-Sent Events) and non-streaming replies.
/chat/messageSend a message to an AI employee. A session is created automatically when session_id is omitted.
Request Body
| Parameter | Type | Required | Description |
|---|---|---|---|
employee_id | string | Yes | ID of the AI employee to chat with |
messages | object[] | Yes | Conversation history: [{ role: "system" | "user" | "assistant", content: string }] |
stream | boolean | No | SSE streaming when true (default: true). Set false for a single JSON reply. |
session_id | string | No | Continue an existing session |
temperature | number | No | Sampling temperature (default: 0.7) |
max_tokens | integer | No | Cap on generated tokens |
Example Request (non-streaming)
{
"employee_id": "atlas",
"messages": [
{ "role": "user", "content": "Schedule a meeting with the marketing team for tomorrow at 2pm" }
],
"stream": false
}Streaming
Default is streaming. With stream: true the reply arrives as Server-Sent Events; send Accept: text/event-stream.
curl -X POST https://liquidcortex.ai/api/chat/message \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: text/event-stream" \
-d '{"employee_id": "atlas", "messages": [{"role": "user", "content": "Draft an email..."}], "stream": true}'The response body is not typed in the OpenAPI document; inspect it in the live Swagger UI.
/chat/conversationsList conversations for the authenticated user.
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
status | string | No | all, active, archived |
employee_id | string | No | Filter by employee |
limit | integer | No | Max results (default: 50, max: 100) |
offset | integer | No | Pagination offset (default: 0) |
Response
{
"conversations": [ /* ConversationListItem[] */ ],
"total": 0,
"limit": 50,
"offset": 0,
"has_more": false
}/chat/conversations/{conversation_id}Get a conversation with its message history (message_limit default 100, max 500; message_offset for paging).
/chat/conversations/{conversation_id}Update a conversation's title or summary.
/chat/conversations/{conversation_id}Delete a conversation and all its messages.
Knowledge Base
Upload documents that your AI employees can reference, then search them semantically.
/knowledge/documentsUpload a document to the knowledge base.
Content-Type: Use multipart/form-data for file uploads.
Form Fields
| Parameter | Type | Required | Description |
|---|---|---|---|
file | file | Yes | Document file (PDF, DOCX, TXT, MD) |
metadata | string | No | JSON metadata string |
Response
{
"id": "...",
"name": "...",
"file_type": "...",
"file_size_bytes": 0,
"status": "...",
"message": "...",
"created_at": "..."
}/knowledge/documentsList documents (query: status, limit default 50 max 100, offset).
/knowledge/documents/{document_id}Get one document, including chunk and token counts and processing status.
/knowledge/documents/{document_id}Delete a document from the knowledge base.
/knowledge/querySemantic search across your documents.
Request Body
| Parameter | Type | Required | Description |
|---|---|---|---|
query | string | Yes | Search query |
top_k | integer | No | Number of results (default: 5) |
similarity_threshold | number | No | Minimum similarity (default: 0.7) |
employee_id | string | No | Filter by employee context |
Example Request
{
"query": "What is our refund policy?",
"top_k": 5,
"similarity_threshold": 0.7
}Response
{
"query": "What is our refund policy?",
"results": [
{
"chunk_id": "...",
"document_id": "...",
"document_name": "...",
"content": "...",
"chunk_index": 0,
"similarity": 0.0,
"metadata": {}
}
],
"count": 1,
"search_time_ms": 0
}Workflows
Chain multiple AI employees into an ordered sequence of steps, then run it manually, on a schedule, or from a webhook.
/workflowsCreate a new workflow.
Request Body
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Workflow name |
description | string | No | Up to 2000 characters |
trigger_type | string | No | manual (default), schedule, webhook, event |
trigger_config | object | No | { cron?, webhook_path?, event_name? } |
steps | object[] | No | Each step: { order, employee_id, action, input, input_mapping?, condition? } |
tags | string[] | No | Workflow tags |
Example: two-step review pipeline
{
"name": "Lead qualification pipeline",
"trigger_type": "manual",
"steps": [
{
"order": 1,
"employee_id": "hunter",
"action": "analyze",
"input": "Qualify this lead: {{input.lead}}"
},
{
"order": 2,
"employee_id": "sterling",
"action": "generate",
"input": "Draft a proposal based on: {{prev.output}}"
}
]
}action is the StepAction enum: analyze, generate, review, execute.
/workflowsList workflows (query: status = draft | active | inactive | archived, trigger_type, limit, offset).
/workflows/{workflow_id}Get one workflow. PUT updates it; DELETE removes it.
/workflows/{workflow_id}/runRun a workflow now.
| Parameter | Type | Required | Description |
|---|---|---|---|
input_data | object | No | Initial input available to step templates (default: {}) |
triggered_by | string | No | Who or what triggered the run (default: "user") |
Returns a WorkflowRunResponse: id, status (pending | running | completed | failed | cancelled), steps_completed, steps_total, progress_percent, credits_used, results.
/workflows/{workflow_id}/runsExecution history for a workflow (query: status, limit, offset).
Integrations
Connect third-party services to extend employee capabilities.
/integrations/availableList the integrations that can be connected (id, name, category, description).
/integrations/connectionsList your connected integrations and their status.
/integrations/{integration_id}/connectStart an OAuth connection. Returns { auth_url, message }; redirect the user to auth_url.
Integration IDs
As returned by GET /integrations/available on 2026-09-15 (21 entries).
/integrations/{integration_id}/disconnectDisconnect an integration. Returns { success, message }.
MCP (Model Context Protocol)
Two directions. Client: register any server that speaks MCP over Streamable HTTP and your employees can call its tools. Server: Cortex Memory is itself exposed as an MCP server, so Claude Desktop, Cursor or any MCP host can read and write your workspace memory with a live API key. Paths below are as published in the live OpenAPI spec on 2026-09-15; a dashboard for the client side lives at /dashboard/mcp.
Connect external MCP servers (client)
/mcp/serversRegister a Streamable HTTP MCP server for the authenticated user. Body: { server_url (required), auth_token (optional, stored encrypted), name (optional) }. Returns the server id and its tool list.
curl -X POST https://liquidcortex.ai/api/mcp/servers \
-H "Authorization: Bearer $LIQUIDCORTEX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"server_url": "https://mcp.example.com/mcp", "name": "Example tools"}'/mcp/servers/{server_id}Disconnect and forget a registered server.
/mcp/toolsList every tool available to you across registered servers and the local bridge, with the server_id each belongs to.
/mcp/tools/callInvoke one registered tool by name with JSON arguments, as the authenticated user.
/mcp/statusRegistered servers with connection state (connected, not reachable, token needs re-entry) and tool counts.
Cortex Memory as an MCP server
/mcp/cortex/tools/listTool catalog in the MCP spec shape. Requires a live API key (lc_live_sk_ / lc_test_sk_).
/mcp/cortex/toolsStreamable HTTP transport: a JSON-RPC 2.0 envelope with method tools/call. Tools: cortex_pre_task_brief and cortex_post_task_ingest.
/mcp/cortex/healthUnauthenticated liveness probe.
Webhooks
Outbound webhook delivery for LiquidCortex events is on the post-launch roadmap. There is no subscription endpoint in the API today.
The platform does receive inbound webhooks from payment and integration providers (Stripe billing events; Unified.to integration events), and a workflow withtrigger_type: "webhook"can be started via POST /workflows/webhook/{webhook_path}. It does not yet emit outbound events such as task.completed.
If outbound webhooks are a hard requirement for your workflow, contact us at[email protected] so we can prioritize the design.
Rate Limits
API requests are rate-limited based on your subscription tier. Limits reset every minute.
| Tier | Requests/min | Burst | Concurrent |
|---|---|---|---|
| Starter | 60 | 10 | 5 |
| Manager | 300 | 50 | 20 |
| Agency | 1,000 | 200 | 100 |
When you are limited
The API answers with HTTP 429 and this JSON body (observed live on 2026-09-15):
{
"error": "rate_limit_exceeded",
"message": "Rate limit exceeded for starter tier",
"retry_after_seconds": 0.82,
"upgrade_url": "/api/pricing/upgrade/calculate"
}Error Handling
The API uses standard HTTP status codes. Validation failures follow the FastAPI convention (HTTP 422 with a detail array); other errors return a JSON object with anerror code and a human-readable message.
Validation Error (422)
{
"detail": [
{
"loc": ["body", "employee_id"],
"msg": "Field required",
"type": "missing"
}
]
}HTTP Status Codes
SDKs & Libraries
Official client libraries are not yet published. Package names will be announced when they ship.
Until then, the OpenAPI document is the contract: any OpenAPI 3 client generator (openapi-generator, openapi-typescript, oapi-codegen, and similar) can produce a typed client from it.
Need Help?
Questions about an endpoint? Check the live Swagger UI first, then contact support.