Developer platform — preview. The REST API, webhooks, and SDKs are in active development and not yet generally available. Endpoints and API keys may change, and the client SDKs are not yet published. We'll announce general availability when it's ready.
Developers/Documentation

API Documentation

Hand-written guide to the most-used LiquidCortex REST endpoints. The generated OpenAPI reference below is the complete, always-current source.

OpenAPI 8.0.0Reconciled against the live spec: September 2026

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/api

Paths 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_xxxxxxxxxxxxxxxxxxxx

API Key Types

Live Keys

Prefix: lc_live_sk_
Use in production. Consumes credits.

Test Keys

Prefix: lc_test_sk_
Use for development. Free but rate-limited.

Key management endpoints

POST/keys

Create an API key. The full key is returned once, in this response only.

ParameterTypeRequiredDescription
namestringYesHuman-readable name for the key
key_typestringNo"live" or "test" (default: live)
permissionsstring[]Noread, write, employees, knowledge, workflows (default: ["read", "write"])
GET/keys

List your API keys (prefix only; the secret is never returned again).

DELETE/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.

GET/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.

GET/employees/{employee_id}

Get one employee by ID. Same EmployeeInfoResponse shape as the list.

Path Parameters

ParameterTypeRequiredDescription
employee_idstringYesThe 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.

POST/chat/message

Send a message to an AI employee. A session is created automatically when session_id is omitted.

Request Body

ParameterTypeRequiredDescription
employee_idstringYesID of the AI employee to chat with
messagesobject[]YesConversation history: [{ role: "system" | "user" | "assistant", content: string }]
streambooleanNoSSE streaming when true (default: true). Set false for a single JSON reply.
session_idstringNoContinue an existing session
temperaturenumberNoSampling temperature (default: 0.7)
max_tokensintegerNoCap 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.

GET/chat/conversations

List conversations for the authenticated user.

Query Parameters

ParameterTypeRequiredDescription
statusstringNoall, active, archived
employee_idstringNoFilter by employee
limitintegerNoMax results (default: 50, max: 100)
offsetintegerNoPagination offset (default: 0)

Response

{
  "conversations": [ /* ConversationListItem[] */ ],
  "total": 0,
  "limit": 50,
  "offset": 0,
  "has_more": false
}
GET/chat/conversations/{conversation_id}

Get a conversation with its message history (message_limit default 100, max 500; message_offset for paging).

PATCH/chat/conversations/{conversation_id}

Update a conversation's title or summary.

DELETE/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.

POST/knowledge/documents

Upload a document to the knowledge base.

Content-Type: Use multipart/form-data for file uploads.

Form Fields

ParameterTypeRequiredDescription
filefileYesDocument file (PDF, DOCX, TXT, MD)
metadatastringNoJSON metadata string

Response

{
  "id": "...",
  "name": "...",
  "file_type": "...",
  "file_size_bytes": 0,
  "status": "...",
  "message": "...",
  "created_at": "..."
}
GET/knowledge/documents

List documents (query: status, limit default 50 max 100, offset).

GET/knowledge/documents/{document_id}

Get one document, including chunk and token counts and processing status.

DELETE/knowledge/documents/{document_id}

Delete a document from the knowledge base.

POST/knowledge/query

Semantic search across your documents.

Request Body

ParameterTypeRequiredDescription
querystringYesSearch query
top_kintegerNoNumber of results (default: 5)
similarity_thresholdnumberNoMinimum similarity (default: 0.7)
employee_idstringNoFilter 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.

POST/workflows

Create a new workflow.

Request Body

ParameterTypeRequiredDescription
namestringYesWorkflow name
descriptionstringNoUp to 2000 characters
trigger_typestringNomanual (default), schedule, webhook, event
trigger_configobjectNo{ cron?, webhook_path?, event_name? }
stepsobject[]NoEach step: { order, employee_id, action, input, input_mapping?, condition? }
tagsstring[]NoWorkflow 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.

GET/workflows

List workflows (query: status = draft | active | inactive | archived, trigger_type, limit, offset).

GET/workflows/{workflow_id}

Get one workflow. PUT updates it; DELETE removes it.

POST/workflows/{workflow_id}/run

Run a workflow now.

ParameterTypeRequiredDescription
input_dataobjectNoInitial input available to step templates (default: {})
triggered_bystringNoWho 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.

GET/workflows/{workflow_id}/runs

Execution history for a workflow (query: status, limit, offset).

Integrations

Connect third-party services to extend employee capabilities.

GET/integrations/available

List the integrations that can be connected (id, name, category, description).

GET/integrations/connections

List your connected integrations and their status.

POST/integrations/{integration_id}/connect

Start 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).

googlemicrosoftslackhubspotsalesforcepipedrivejiraasanalineartrellozendeskquickbooksxeronetsuiteworkdaybamboohrgustodropboxboxdocusigngoogle-analytics
POST/integrations/{integration_id}/disconnect

Disconnect 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)

POST/mcp/servers

Register 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"}'
DELETE/mcp/servers/{server_id}

Disconnect and forget a registered server.

GET/mcp/tools

List every tool available to you across registered servers and the local bridge, with the server_id each belongs to.

POST/mcp/tools/call

Invoke one registered tool by name with JSON arguments, as the authenticated user.

GET/mcp/status

Registered servers with connection state (connected, not reachable, token needs re-entry) and tool counts.

Cortex Memory as an MCP server

GET/mcp/cortex/tools/list

Tool catalog in the MCP spec shape. Requires a live API key (lc_live_sk_ / lc_test_sk_).

POST/mcp/cortex/tools

Streamable HTTP transport: a JSON-RPC 2.0 envelope with method tools/call. Tools: cortex_pre_task_brief and cortex_post_task_ingest.

GET/mcp/cortex/health

Unauthenticated 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.

TierRequests/minBurstConcurrent
Starter60105
Manager3005020
Agency1,000200100

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

200Success
400Bad Request - Invalid parameters
401Unauthorized - Invalid or missing API key
403Forbidden - Insufficient permissions
404Not Found - Resource does not exist
422Unprocessable Entity - Request body failed validation
429Too Many Requests - Rate limit exceeded
500Server Error - Something went wrong on our end

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.