Project Management API

Build, deploy, and operate Conduet projects entirely via HTTP. This API exposes the same surface the dashboard uses — create projects, edit workflows, upload knowledge bases, manage channel deployments, and mint API keys, all from your own code or CI pipeline.

Authentication

The Project Management API is authenticated with an account-level developer token. Create one at Account → API keys → Developer API tokens. Tokens start with the cdt_acc_ prefix and grant full access to projects owned by the user who created them. Treat them like passwords.

Project-scoped widget keys (cdt_…) are not accepted on these endpoints — they only authorise the public conversation and widget API.

Request
curl https://api.conduet.ai/v1/projects \
  -H "Authorization: Bearer cdt_acc_..." \
  -H "Content-Type: application/json"

Base URL

All management endpoints are served under:

https://api.conduet.ai/v1

Projects

GET
/v1/projects

List projects owned by the authenticated user

POST
/v1/projects

Create a new blank project

GET
/v1/projects/templates

List available project templates

POST
/v1/projects/templates

Create a project from a template

POST
/v1/projects/generate

AI-generate a project from a natural-language brief

POST
/v1/projects/import

Import a project — auto-detects Voiceflow vs. Conduet-native JSON

GET
/v1/projects/:projectId

Fetch a single project with its full schema

PATCH
/v1/projects/:projectId

Update any part of the project — workflows, variables, tools, prompts, widget config

DELETE
/v1/projects/:projectId

Delete a project and all its data

Create a project
POST /v1/projects
Authorization: Bearer cdt_acc_...
Content-Type: application/json

{
  "name": "Support copilot"
}
Update workflows via PATCH
PATCH /v1/projects/proj_abc123
{
  "workflows": [
    {
      "id": "wf_main",
      "name": "Main",
      "steps": [ /* WorkflowStep[] */ ],
      "connections": [ /* StepConnection[] */ ]
    }
  ]
}

Chat with an agent

Send messages to a project's agent over HTTP without going through the widget. This is the fastest way to script conversations, run automated evals, or embed an agent behind your own UI. If you omit versionId, the request is routed to the in-editor development version — no publish required.

POST
/v1/projects/:projectId/chat

Send a single message and get the agent reply as JSON

POST
/v1/projects/:projectId/chat/stream

Same, but streamed as Server-Sent Events (one JSON trace per event, terminated by [DONE])

Send a message
POST /v1/projects/proj_abc123/chat
Authorization: Bearer cdt_acc_...
Content-Type: application/json

{
  "message": "How do I reset my password?",
  "userId": "user_42",        // optional — defaults to "api", used for session state
  "versionId": "development"  // optional — "development" | "production" | "staging" | "<versionId>"
}
curl
curl -X POST https://api.conduet.ai/v1/projects/proj_abc123/chat \
  -H "Authorization: Bearer cdt_acc_..." \
  -H "Content-Type: application/json" \
  -d '{"message":"Hello","userId":"user_42"}'

The JSON response contains the agent's messages, any tool calls, updated session variables, and the execution trace. Subsequent calls with the same userId continue the same conversation — session state (memory, variables, step stack) is kept on the server.

Stream traces (SSE)
curl -N -X POST https://api.conduet.ai/v1/projects/proj_abc123/chat/stream \
  -H "Authorization: Bearer cdt_acc_..." \
  -H "Content-Type: application/json" \
  -d '{"message":"Hello","userId":"user_42"}'

# → data: {"type":"message","content":"Hi! How can I help?"}
# → data: {"type":"tool_call",...}
# → data: [DONE]

Chat endpoints are rate-limited per projectId:userId. Check X-RateLimit-Remaining on the response headers. Over the limit you'll get a 429.

Versions & Publishing

POST
/v1/projects/:projectId/publish

Publish the current state as a new version

GET
/v1/projects/:projectId/publish

List all published versions

Knowledge Base

GET
/v1/projects/:projectId/kb

List knowledge-base documents

POST
/v1/projects/:projectId/kb

Add a text document to the KB

POST
/v1/projects/:projectId/kb/upload

Upload a file, URL, or pasted content (PDF, DOCX, URL crawl)

POST
/v1/projects/:projectId/kb/search

Semantic search across all documents in the knowledge base

GET
/v1/projects/:projectId/kb/:docId

Retrieve a single document

DELETE
/v1/projects/:projectId/kb/:docId

Delete a document and its chunks

Channel Deployments

GET
/v1/projects/:projectId/deployments

List channel deployments

POST
/v1/projects/:projectId/deployments

Create a deployment (webchat, WhatsApp, Messenger, Instagram, WeChat)

PATCH
/v1/projects/:projectId/deployments/:deploymentId

Update deployment credentials, branding or version

DELETE
/v1/projects/:projectId/deployments/:deploymentId

Remove a deployment

Project API Keys

Project-scoped keys are used by the widget and public conversation API. Mint them for each project you deploy.

GET
/v1/projects/:projectId/api-keys

List project API keys

POST
/v1/projects/:projectId/api-keys

Create a new project API key

DELETE
/v1/projects/:projectId/api-keys/:keyId

Revoke a project API key

Transcripts & Analytics

GET
/v1/projects/:projectId/transcripts

List conversation transcripts

GET
/v1/projects/:projectId/transcripts/:transcriptId

Fetch a full transcript with messages

GET
/v1/projects/:projectId/analytics

Aggregated analytics for the project

GET
/v1/projects/:projectId/usage?days=30

Token usage and LLM cost breakdown over a window

Developer Tokens (self-service)

A developer token cannot mint new developer tokens (to contain the blast radius of a leak). These endpoints are only usable from an interactive dashboard session.

GET
/v1/account/api-keys

List your developer tokens

POST
/v1/account/api-keys

Create a developer token (dashboard session only)

DELETE
/v1/account/api-keys/:keyId

Revoke a developer token

Errors

All errors return a JSON body with an error message and a machine-readable code. Common codes are BAD_REQUEST, UNAUTHORIZED, FORBIDDEN, NOT_FOUND, and CONFLICT.