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.
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/v1Projects
/v1/projectsList projects owned by the authenticated user
/v1/projectsCreate a new blank project
/v1/projects/templatesList available project templates
/v1/projects/templatesCreate a project from a template
/v1/projects/generateAI-generate a project from a natural-language brief
/v1/projects/importImport a project — auto-detects Voiceflow vs. Conduet-native JSON
/v1/projects/:projectIdFetch a single project with its full schema
/v1/projects/:projectIdUpdate any part of the project — workflows, variables, tools, prompts, widget config
/v1/projects/:projectIdDelete a project and all its data
POST /v1/projects
Authorization: Bearer cdt_acc_...
Content-Type: application/json
{
"name": "Support copilot"
}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.
/v1/projects/:projectId/chatSend a single message and get the agent reply as JSON
/v1/projects/:projectId/chat/streamSame, but streamed as Server-Sent Events (one JSON trace per event, terminated by [DONE])
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 -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.
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
/v1/projects/:projectId/publishPublish the current state as a new version
/v1/projects/:projectId/publishList all published versions
Knowledge Base
/v1/projects/:projectId/kbList knowledge-base documents
/v1/projects/:projectId/kbAdd a text document to the KB
/v1/projects/:projectId/kb/uploadUpload a file, URL, or pasted content (PDF, DOCX, URL crawl)
/v1/projects/:projectId/kb/searchSemantic search across all documents in the knowledge base
/v1/projects/:projectId/kb/:docIdRetrieve a single document
/v1/projects/:projectId/kb/:docIdDelete a document and its chunks
Channel Deployments
/v1/projects/:projectId/deploymentsList channel deployments
/v1/projects/:projectId/deploymentsCreate a deployment (webchat, WhatsApp, Messenger, Instagram, WeChat)
/v1/projects/:projectId/deployments/:deploymentIdUpdate deployment credentials, branding or version
/v1/projects/:projectId/deployments/:deploymentIdRemove a deployment
Project API Keys
Project-scoped keys are used by the widget and public conversation API. Mint them for each project you deploy.
/v1/projects/:projectId/api-keysList project API keys
/v1/projects/:projectId/api-keysCreate a new project API key
/v1/projects/:projectId/api-keys/:keyIdRevoke a project API key
Transcripts & Analytics
/v1/projects/:projectId/transcriptsList conversation transcripts
/v1/projects/:projectId/transcripts/:transcriptIdFetch a full transcript with messages
/v1/projects/:projectId/analyticsAggregated analytics for the project
/v1/projects/:projectId/usage?days=30Token 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.
/v1/account/api-keysList your developer tokens
/v1/account/api-keysCreate a developer token (dashboard session only)
/v1/account/api-keys/:keyIdRevoke 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.