NEWConduyt v3 is live: native email + SMS campaigns, now with flow-based automation.See what's new →
API Reference · v1

API Reference.
Every endpoint.

Complete REST API documentation for Conduyt CRM. Parameters, response schemas, and curl examples for every endpoint.

REST API · v1

API Reference

The same endpoints that power the Conduyt web app. Every request requires a Bearer token. All responses return JSON.

Base URL: https://conduyt.app/api/v1

Authentication

All requests require a Bearer token in the Authorization header. Generate API keys in Settings → API. Keys are prefixed with cdy_.

Authorization Header
curl https://conduyt.app/api/v1/contacts \
  -H "Authorization: Bearer cdy_your_api_key" \
  -H "Content-Type: application/json"

Errors

All error responses return a JSON body with a stable code, human-readable message, and optional details array for validation errors.

Error Response Format
{
  "error": {
    "code": "validation_failed",
    "message": "The request body contains invalid fields.",
    "details": [
      { "field": "email", "message": "Must be a valid email address" }
    ]
  }
}
StatusCodeDescription
400invalid_requestMalformed request body or query
401unauthenticatedMissing or invalid API key
403permission_deniedKey lacks required scope
404not_foundResource does not exist
422validation_failedSemantic validation error
429rate_limitedRate limit exceeded
500internal_errorServer error — retry

Contacts

Manage contacts in your CRM. Contacts represent people your team interacts with: leads, customers, partners.

GET/api/v1/contacts

List all contacts with optional filters and pagination.

200 OK401 Unauthorized
Query Parameters
ParameterDescription
pageintegeroptionalPage number (default: 1)
limitintegeroptionalItems per page (default: 50, max: 100)
searchstringoptionalSearch by name, email, or phone
tagstringoptionalFilter by tag name
sourcestringoptionalFilter by lead source
assigned_touuidoptionalFilter by assigned user ID
created_afterISO 8601optionalContacts created after this date
created_beforeISO 8601optionalContacts created before this date
Response
200 OK
{
  "data": [
    {
      "id": "550e8400-e29b-41d4-a716-446655440000",
      "firstName": "Sarah",
      "lastName": "Kim",
      "email": "sarah.kim@example.com",
      "phone": "+14155552671",
      "company": "Acme Corp",
      "source": "website",
      "tags": ["enterprise", "active"],
      "assignedTo": "usr_8f14e45f",
      "createdAt": "2026-03-15T10:30:00Z",
      "updatedAt": "2026-04-10T14:22:00Z"
    }
  ],
  "meta": { "page": 1, "limit": 50, "total": 342, "totalPages": 7 }
}
Example
curl
curl -H "Authorization: Bearer cdy_your_api_key" \
  "https://conduyt.app/api/v1/contacts?search=sarah&limit=10"
POST/api/v1/contacts

Create a new contact in the workspace.

201 Created422 Validation
Request Body
FieldDescription
firstNamestringrequiredContact first name
lastNamestringrequiredContact last name
emailstringoptionalEmail address
phonestringoptionalPhone number (E.164 format)
companystringoptionalCompany name
sourcestringoptionalLead source (e.g., website, referral, ad)
tagsstring[]optionalArray of tag names to apply
assignedTouuidoptionalUser ID to assign this contact to
customFieldsobjectoptionalKey-value pairs for custom fields
Example
curl
curl -X POST https://conduyt.app/api/v1/contacts \
  -H "Authorization: Bearer cdy_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "firstName": "Sarah",
    "lastName": "Kim",
    "email": "sarah.kim@acme.com",
    "phone": "+14155552671",
    "company": "Acme Corp",
    "source": "website",
    "tags": ["enterprise"]
  }'
GET/api/v1/contacts/:id

Retrieve a single contact by ID. Returns the full contact object including custom fields and tags.

200 OK404 Not Found
curl
curl -H "Authorization: Bearer cdy_your_api_key" \
  https://conduyt.app/api/v1/contacts/550e8400-e29b-41d4-a716-446655440000
PATCH/api/v1/contacts/:id

Update a contact. Only include fields you want to change. Unspecified fields are left unchanged.

200 OK404 Not Found422 Validation
curl
curl -X PATCH https://conduyt.app/api/v1/contacts/550e8400-... \
  -H "Authorization: Bearer cdy_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{ "company": "Acme Industries", "source": "referral" }'
DELETE/api/v1/contacts/:id

Permanently delete a contact and all associated data (notes, tasks, conversations). This action cannot be undone.

204 No Content404 Not Found
curl
curl -X DELETE -H "Authorization: Bearer cdy_your_api_key" \
  https://conduyt.app/api/v1/contacts/550e8400-...
POST/api/v1/contacts/:id/tags

Add one or more tags to a contact. Tags are created automatically if they do not already exist.

200 OK
curl
curl -X POST https://conduyt.app/api/v1/contacts/550e8400-.../tags \
  -H "Authorization: Bearer cdy_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{ "tags": ["vip", "q2-campaign"] }'
DELETE/api/v1/contacts/:id/tags/:tagId

Remove a specific tag from a contact.

204 No Content
curl
curl -X DELETE -H "Authorization: Bearer cdy_your_api_key" \
  https://conduyt.app/api/v1/contacts/550e8400-.../tags/tag_abc123
POST/api/v1/contacts/import

Import contacts from a CSV file or JSON array. Deduplication is performed on email address. Existing contacts are updated; new contacts are created.

202 Accepted422 Validation
Request Body
FieldDescription
contactsobject[]requiredArray of contact objects (max 1,000 per request)
tagsstring[]optionalTags to apply to all imported contacts
sourcestringoptionalLead source to assign to all imported contacts
Response · 202 Accepted
{
  "importId": "imp_01HX7Q5CA",
  "status": "processing",
  "total": 150,
  "created": 0,
  "updated": 0,
  "errors": 0
}

Companies

Manage companies and organizations. Companies can be linked to multiple contacts.

GET/api/v1/companies

List all companies with optional search and pagination.

200 OK
ParameterDescription
pageintegeroptionalPage number (default: 1)
limitintegeroptionalItems per page (default: 50, max: 100)
searchstringoptionalSearch by company name
200 OK
{
  "data": [
    {
      "id": "comp_01HX7Q5CA",
      "name": "Acme Corp",
      "domain": "acme.com",
      "industry": "Technology",
      "size": "51-200",
      "contactCount": 12,
      "createdAt": "2026-02-10T08:00:00Z"
    }
  ],
  "meta": { "page": 1, "limit": 50, "total": 87, "totalPages": 2 }
}
POST/api/v1/companies

Create a new company.

201 Created422 Validation
FieldDescription
namestringrequiredCompany name
domainstringoptionalWebsite domain
industrystringoptionalIndustry classification
sizestringoptionalCompany size (1-10, 11-50, 51-200, 201-500, 500+)
addressobjectoptionalAddress object with street, city, state, zip, country
GET/api/v1/companies/:id

Retrieve a single company by ID, including linked contacts.

200 OK404 Not Found
PATCH/api/v1/companies/:id

Update company fields. Only include fields you want to change.

200 OK404 Not Found
DELETE/api/v1/companies/:id

Delete a company. Linked contacts are not deleted but the association is removed.

204 No Content404 Not Found

Deals

Manage deals in your pipeline. Deals represent potential revenue and track through stages from qualification to close.

GET/api/v1/deals

List all deals with optional filters. Results are ordered by updated_at descending by default.

200 OK
ParameterDescription
pageintegeroptionalPage number (default: 1)
limitintegeroptionalItems per page (default: 50, max: 100)
pipelineIdstringoptionalFilter by pipeline ID
stageIdstringoptionalFilter by stage ID
assignedTouuidoptionalFilter by assigned user ID
statusstringoptionalFilter by status: open, won, lost
200 OK
{
  "data": [
    {
      "id": "deal_01HX7Q5CA",
      "name": "Northwind Logistics",
      "value": 42000,
      "currency": "USD",
      "pipelineId": "pipe_new_business",
      "stageId": "stage_qualified",
      "probability": 0.55,
      "assignedTo": "usr_8f14e45f",
      "contactId": "550e8400-e29b-41d4-a716-446655440000",
      "companyId": "comp_01HX7Q5CA",
      "status": "open",
      "expectedCloseDate": "2026-05-15",
      "createdAt": "2026-04-01T14:22:03Z",
      "updatedAt": "2026-04-14T09:11:47Z"
    }
  ],
  "meta": { "page": 1, "limit": 50, "total": 156, "totalPages": 4 }
}
POST/api/v1/deals

Create a new deal in a pipeline.

201 Created422 Validation
FieldDescription
namestringrequiredDeal name
valuenumberrequiredDeal value in cents or whole units
pipelineIdstringrequiredPipeline to place the deal in
stageIdstringrequiredInitial stage within the pipeline
contactIduuidoptionalAssociated contact ID
companyIdstringoptionalAssociated company ID
assignedTouuidoptionalUser ID to own this deal
expectedCloseDatedateoptionalExpected close date (YYYY-MM-DD)
customFieldsobjectoptionalKey-value pairs for custom fields
curl
curl -X POST https://conduyt.app/api/v1/deals \
  -H "Authorization: Bearer cdy_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Northwind Logistics",
    "value": 42000,
    "pipelineId": "pipe_new_business",
    "stageId": "stage_qualified",
    "contactId": "550e8400-e29b-41d4-a716-446655440000"
  }'
GET/api/v1/deals/:id

Retrieve a single deal by ID, including pipeline, stage, contact, and company details.

200 OK404 Not Found
PATCH/api/v1/deals/:id

Update a deal. Move between stages by changing stageId. Changing status to "won" or "lost" closes the deal.

200 OK404 Not Found
curl · Move deal to next stage
curl -X PATCH https://conduyt.app/api/v1/deals/deal_01HX7Q5CA \
  -H "Authorization: Bearer cdy_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{ "stageId": "stage_proposal", "value": 48000 }'

Pipelines

Configure sales pipelines and their stages. Each workspace can have multiple pipelines for different sales processes.

GET/api/v1/pipelines

List all pipelines in the workspace.

200 OK
200 OK
{
  "data": [
    {
      "id": "pipe_new_business",
      "name": "New Business",
      "stageCount": 5,
      "dealCount": 42,
      "totalValue": 1840000,
      "createdAt": "2026-01-10T08:00:00Z"
    }
  ],
  "meta": { "page": 1, "limit": 50, "total": 3, "totalPages": 1 }
}
POST/api/v1/pipelines

Create a new pipeline with initial stages.

201 Created
FieldDescription
namestringrequiredPipeline name
stagesobject[]optionalArray of stage objects with name, order, and probability
GET/api/v1/pipelines/:id

Retrieve a pipeline with its stages and summary statistics.

200 OK404 Not Found
PATCH/api/v1/pipelines/:id

Update pipeline name or settings.

200 OK
GET/api/v1/pipelines/:id/stages

List all stages in a pipeline, ordered by position.

200 OK
200 OK
{
  "data": [
    { "id": "stage_lead", "name": "Lead", "order": 1, "probability": 0.1 },
    { "id": "stage_qualified", "name": "Qualified", "order": 2, "probability": 0.3 },
    { "id": "stage_proposal", "name": "Proposal", "order": 3, "probability": 0.6 },
    { "id": "stage_negotiation", "name": "Negotiation", "order": 4, "probability": 0.8 },
    { "id": "stage_closed_won", "name": "Closed Won", "order": 5, "probability": 1.0 }
  ]
}
POST/api/v1/pipelines/:id/stages

Add a new stage to a pipeline.

201 Created
FieldDescription
namestringrequiredStage name
orderintegerrequiredPosition in the pipeline
probabilitynumberoptionalWin probability (0.0 to 1.0)
PATCH/api/v1/pipelines/:id/stages/:stageId

Update a stage name, position, or probability.

200 OK

Tasks

Manage tasks assigned to team members. Tasks can be linked to contacts or deals.

GET/api/v1/tasks

List all tasks with optional filters for status, assignee, and due date.

200 OK
ParameterDescription
statusstringoptionalFilter: pending, completed, overdue
assignedTouuidoptionalFilter by assigned user
contactIduuidoptionalFilter by linked contact
dealIdstringoptionalFilter by linked deal
due_beforeISO 8601optionalTasks due before this date
200 OK
{
  "data": [
    {
      "id": "task_01HX8K3FB",
      "title": "Follow up with Sarah Kim",
      "description": "Send proposal for Q2 renewal",
      "status": "pending",
      "priority": "high",
      "dueDate": "2026-04-20T17:00:00Z",
      "assignedTo": "usr_8f14e45f",
      "contactId": "550e8400-e29b-41d4-a716-446655440000",
      "dealId": "deal_01HX7Q5CA",
      "createdAt": "2026-04-15T10:00:00Z"
    }
  ],
  "meta": { "page": 1, "limit": 50, "total": 28, "totalPages": 1 }
}
POST/api/v1/tasks

Create a new task.

201 Created
FieldDescription
titlestringrequiredTask title
descriptionstringoptionalTask description
dueDateISO 8601optionalDue date and time
prioritystringoptionalPriority: low, medium, high
assignedTouuidoptionalAssigned user ID
contactIduuidoptionalLink to a contact
dealIdstringoptionalLink to a deal
GET/api/v1/tasks/:id

Retrieve a single task by ID.

200 OK404 Not Found
PATCH/api/v1/tasks/:id

Update a task. Set status to "completed" to mark done.

200 OK
curl · Complete a task
curl -X PATCH https://conduyt.app/api/v1/tasks/task_01HX8K3FB \
  -H "Authorization: Bearer cdy_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{ "status": "completed" }'

Notes

Add notes to contacts and deals. Notes appear in the activity timeline and support rich text.

GET/api/v1/notes

List notes, optionally filtered by contact or deal.

200 OK
ParameterDescription
contactIduuidoptionalFilter notes for a specific contact
dealIdstringoptionalFilter notes for a specific deal
200 OK
{
  "data": [
    {
      "id": "note_01HX9P2QR",
      "content": "Had a great call. They're interested in the premium tier.",
      "contactId": "550e8400-e29b-41d4-a716-446655440000",
      "dealId": "deal_01HX7Q5CA",
      "createdBy": "usr_8f14e45f",
      "createdAt": "2026-04-14T15:30:00Z"
    }
  ],
  "meta": { "page": 1, "limit": 50, "total": 5, "totalPages": 1 }
}
POST/api/v1/notes

Create a note on a contact or deal.

201 Created
FieldDescription
contentstringrequiredNote content (supports markdown)
contactIduuidoptionalAttach to a contact
dealIdstringoptionalAttach to a deal
GET/api/v1/notes/:id

Retrieve a single note by ID.

200 OK404 Not Found
PATCH/api/v1/notes/:id

Update note content.

200 OK

Tags

Manage tags for segmenting and organizing contacts.

GET/api/v1/tags

List all tags in the workspace with contact counts.

200 OK
200 OK
{
  "data": [
    { "id": "tag_abc123", "name": "enterprise", "color": "#22F5A4", "contactCount": 45 },
    { "id": "tag_def456", "name": "vip", "color": "#956EFA", "contactCount": 12 },
    { "id": "tag_ghi789", "name": "churned", "color": "#FD88C0", "contactCount": 8 }
  ],
  "meta": { "page": 1, "limit": 50, "total": 15, "totalPages": 1 }
}
POST/api/v1/tags

Create a new tag.

201 Created
FieldDescription
namestringrequiredTag name (unique per workspace)
colorstringoptionalHex color code for display
GET/api/v1/tags/:id

Retrieve a single tag with its contact count.

200 OK404 Not Found
PATCH/api/v1/tags/:id

Update tag name or color.

200 OK

Messages

Send SMS and email messages to contacts. View message history and delivery status.

GET/api/v1/messages

List messages with optional filters for contact, channel, and direction.

200 OK
ParameterDescription
contactIduuidoptionalFilter by contact
channelstringoptionalFilter: sms, email
directionstringoptionalFilter: inbound, outbound
200 OK
{
  "data": [
    {
      "id": "msg_01HXA3B2C",
      "contactId": "550e8400-...",
      "channel": "sms",
      "direction": "outbound",
      "body": "Hi Sarah, just following up on our conversation...",
      "status": "delivered",
      "sentAt": "2026-04-15T11:30:00Z"
    }
  ],
  "meta": { "page": 1, "limit": 50, "total": 234, "totalPages": 5 }
}
POST/api/v1/messages

Send a message to a contact via SMS or email.

201 Created422 Validation
FieldDescription
contactIduuidrequiredRecipient contact ID
channelstringrequiredChannel: sms or email
bodystringrequiredMessage body (plain text for SMS, HTML for email)
subjectstringoptionalEmail subject (required for email channel)
curl · Send SMS
curl -X POST https://conduyt.app/api/v1/messages \
  -H "Authorization: Bearer cdy_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "contactId": "550e8400-e29b-41d4-a716-446655440000",
    "channel": "sms",
    "body": "Hi Sarah, your proposal is ready. Let us know if you have questions!"
  }'

Conversations

View threaded conversation history for contacts, across SMS and email channels.

GET/api/v1/conversations

List all conversation threads with latest message preview.

200 OK
200 OK
{
  "data": [
    {
      "id": "conv_01HXAB3CD",
      "contactId": "550e8400-...",
      "contactName": "Sarah Kim",
      "lastMessage": "Thanks, I'll review the proposal tonight.",
      "lastChannel": "sms",
      "lastAt": "2026-04-15T18:45:00Z",
      "unreadCount": 1
    }
  ],
  "meta": { "page": 1, "limit": 50, "total": 89, "totalPages": 2 }
}
GET/api/v1/conversations/:contactId

Get the full conversation thread for a specific contact, with all messages across channels.

200 OK404 Not Found

Calendars

Manage calendars and appointments. Create booking links, schedule meetings, and track availability.

GET/api/v1/calendars

List all calendars in the workspace.

200 OK
POST/api/v1/calendars

Create a new calendar with availability settings.

201 Created
FieldDescription
namestringrequiredCalendar name
timezonestringrequiredIANA timezone (e.g., America/New_York)
slotDurationintegeroptionalAppointment duration in minutes (default: 30)
availabilityobjectoptionalWeekly availability windows
GET/api/v1/calendars/:id

Retrieve calendar details and availability settings.

200 OK404 Not Found
PATCH/api/v1/calendars/:id

Update calendar settings.

200 OK
GET/api/v1/calendars/:id/appointments

List appointments for a calendar with optional date range filter.

200 OK
ParameterDescription
startISO 8601optionalStart of date range
endISO 8601optionalEnd of date range
statusstringoptionalFilter: scheduled, completed, cancelled
200 OK
{
  "data": [
    {
      "id": "appt_01HXB4C5D",
      "calendarId": "cal_abc123",
      "title": "Discovery Call - Sarah Kim",
      "startTime": "2026-04-20T14:00:00Z",
      "endTime": "2026-04-20T14:30:00Z",
      "contactId": "550e8400-...",
      "status": "scheduled",
      "notes": "Discuss Q2 renewal options"
    }
  ],
  "meta": { "page": 1, "limit": 50, "total": 12, "totalPages": 1 }
}
POST/api/v1/calendars/:id/appointments

Schedule a new appointment on a calendar.

201 Created409 Conflict
FieldDescription
titlestringrequiredAppointment title
startTimeISO 8601requiredStart date and time
endTimeISO 8601requiredEnd date and time
contactIduuidoptionalLink to a contact
notesstringoptionalAppointment notes

Custom Fields

Define custom fields for contacts, deals, and companies. Fields support text, number, date, select, and multi-select types.

GET/api/v1/custom-fields

List all custom field definitions.

200 OK
ParameterDescription
entitystringoptionalFilter by entity type: contact, deal, company
200 OK
{
  "data": [
    {
      "id": "field_01HXC5D6E",
      "name": "Lead Score",
      "key": "lead_score",
      "type": "number",
      "entity": "contact",
      "required": false,
      "options": null
    },
    {
      "id": "field_02HXC5D7F",
      "name": "Industry",
      "key": "industry",
      "type": "select",
      "entity": "company",
      "required": false,
      "options": ["Technology", "Healthcare", "Finance", "Retail", "Other"]
    }
  ]
}
POST/api/v1/custom-fields

Define a new custom field.

201 Created422 Validation
FieldDescription
namestringrequiredDisplay name
keystringrequiredAPI key (snake_case, unique per entity)
typestringrequiredType: text, number, date, select, multi_select, boolean
entitystringrequiredEntity type: contact, deal, company
requiredbooleanoptionalWhether the field is required (default: false)
optionsstring[]optionalOptions for select/multi_select fields
PATCH/api/v1/custom-fields/:id

Update a custom field definition. Changing type is not allowed if data exists.

200 OK422 Validation
DELETE/api/v1/custom-fields/:id

Delete a custom field definition. All values for this field across entities are permanently removed.

204 No Content

Webhooks

Register webhook endpoints to receive real-time event notifications. Webhooks are signed with HMAC-SHA256.

GET/api/v1/webhooks

List all registered webhook endpoints.

200 OK
200 OK
{
  "data": [
    {
      "id": "wh_01HXD6E7F",
      "url": "https://your-app.com/webhooks/conduyt",
      "events": ["contact.created", "deal.stage_changed"],
      "active": true,
      "secret": "whsec_...",
      "createdAt": "2026-04-01T10:00:00Z",
      "lastDelivery": "2026-04-15T14:22:00Z",
      "lastStatus": 200
    }
  ]
}
POST/api/v1/webhooks

Register a new webhook endpoint.

201 Created422 Validation
FieldDescription
urlstringrequiredHTTPS endpoint URL
eventsstring[]requiredArray of event names to subscribe to
activebooleanoptionalWhether the webhook is active (default: true)
curl
curl -X POST https://conduyt.app/api/v1/webhooks \
  -H "Authorization: Bearer cdy_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://your-app.com/webhooks/conduyt",
    "events": ["contact.created", "deal.created", "deal.stage_changed"]
  }'
GET/api/v1/webhooks/:id

Retrieve webhook details including delivery history.

200 OK404 Not Found
PATCH/api/v1/webhooks/:id

Update webhook URL, events, or active status.

200 OK
DELETE/api/v1/webhooks/:id

Delete a webhook registration. No further events will be delivered.

204 No Content
POST/api/v1/webhooks/:id/test

Send a test payload to the webhook URL to verify it is receiving and processing events correctly.

200 OK502 Delivery Failed
200 OK
{
  "success": true,
  "statusCode": 200,
  "responseTime": 142,
  "event": "test.ping"
}

Users

Manage team members in the workspace. Invite new users, assign roles, and remove access.

GET/api/v1/users

List all users in the workspace.

200 OK
200 OK
{
  "data": [
    {
      "id": "usr_8f14e45f",
      "name": "David Park",
      "email": "dp@conduyt.app",
      "role": "admin",
      "status": "active",
      "lastActiveAt": "2026-04-15T16:30:00Z",
      "createdAt": "2026-01-01T00:00:00Z"
    }
  ],
  "meta": { "page": 1, "limit": 50, "total": 8, "totalPages": 1 }
}
POST/api/v1/users/invite

Send an invitation email to add a new user to the workspace.

201 Created422 Validation
FieldDescription
emailstringrequiredEmail address to invite
rolestringrequiredRole: admin, member, viewer
namestringoptionalDisplay name for the invitation
GET/api/v1/users/:id

Retrieve a single user by ID.

200 OK404 Not Found
PATCH/api/v1/users/:id

Update a user's role or name. Requires admin scope.

200 OK403 Forbidden
DELETE/api/v1/users/:id

Remove a user from the workspace. Their assigned contacts and deals are unassigned.

204 No Content403 Forbidden

Automations

Manage n8n-powered automations. Register webhook triggers and fire custom events into your workflows.

GET/api/v1/automations

List all automation configurations.

200 OK
200 OK
{
  "data": [
    {
      "id": "auto_01HXE7F8G",
      "name": "New Lead Notification",
      "trigger": "contact.created",
      "webhookUrl": "https://n8n.conduyt.app/webhook/abc123",
      "active": true,
      "lastTriggered": "2026-04-15T12:00:00Z",
      "runCount": 342
    }
  ]
}
POST/api/v1/automations

Create a new automation with a webhook trigger.

201 Created
FieldDescription
namestringrequiredAutomation name
triggerstringrequiredEvent that triggers this automation
webhookUrlstringrequiredn8n webhook URL to call
activebooleanoptionalWhether the automation is active (default: true)
GET/api/v1/automations/:id

Retrieve automation details and run history.

200 OK404 Not Found
POST/api/v1/automations/events

Fire a custom event to trigger any automations listening for it.

202 Accepted
FieldDescription
eventstringrequiredCustom event name (e.g., "custom.lead_scored")
payloadobjectoptionalArbitrary JSON payload passed to the automation
curl
curl -X POST https://conduyt.app/api/v1/automations/events \
  -H "Authorization: Bearer cdy_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "event": "custom.lead_scored",
    "payload": {
      "contactId": "550e8400-...",
      "score": 85,
      "reason": "Visited pricing page 3 times"
    }
  }'

Bulk Operations

Batch update, delete, or tag records. Process up to 1,000 records per request. Operations are processed asynchronously and return a job ID.

POST/api/v1/bulk/contacts/update

Batch update fields across multiple contacts.

202 Accepted
FieldDescription
idsuuid[]requiredArray of contact IDs (max 1,000)
updatesobjectrequiredFields to update (applied to all contacts)
curl
curl -X POST https://conduyt.app/api/v1/bulk/contacts/update \
  -H "Authorization: Bearer cdy_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "ids": ["550e8400-...", "660f9500-...", "770g0600-..."],
    "updates": { "source": "trade-show-2026", "assignedTo": "usr_8f14e45f" }
  }'
202 Accepted
{
  "jobId": "job_01HXF8G9H",
  "status": "processing",
  "total": 3,
  "processed": 0,
  "errors": 0
}
POST/api/v1/bulk/contacts/delete

Batch delete multiple contacts. This is irreversible.

202 Accepted
FieldDescription
idsuuid[]requiredArray of contact IDs to delete (max 1,000)
POST/api/v1/bulk/contacts/tag

Apply tags to multiple contacts at once.

202 Accepted
FieldDescription
idsuuid[]requiredArray of contact IDs (max 1,000)
tagsstring[]requiredTags to apply
POST/api/v1/bulk/deals/update

Batch update fields across multiple deals.

202 Accepted
FieldDescription
idsstring[]requiredArray of deal IDs (max 1,000)
updatesobjectrequiredFields to update

Activities

Audit trail of all actions in the workspace. Every create, update, delete, and login is logged.

GET/api/v1/activities

List activity entries with optional filters. Ordered by timestamp descending.

200 OK
ParameterDescription
entityTypestringoptionalFilter: contact, deal, task, note, pipeline, user
entityIdstringoptionalFilter by specific entity ID
actionstringoptionalFilter: created, updated, deleted, login
userIduuidoptionalFilter by user who performed the action
200 OK
{
  "data": [
    {
      "id": "act_01HXG9H0I",
      "entityType": "deal",
      "entityId": "deal_01HX7Q5CA",
      "action": "updated",
      "changes": { "stageId": { "from": "stage_qualified", "to": "stage_proposal" } },
      "userId": "usr_8f14e45f",
      "userName": "David Park",
      "timestamp": "2026-04-15T14:22:00Z"
    }
  ],
  "meta": { "page": 1, "limit": 50, "total": 1240, "totalPages": 25 }
}

Billing

Manage subscriptions via Stripe. Create checkout sessions, access the billing portal, and check subscription status.

POST/api/v1/billing/checkout

Create a Stripe checkout session for subscribing to a plan.

200 OK
FieldDescription
planstringrequiredPlan ID: starter, standard, premium, enterprise
intervalstringoptionalBilling interval: monthly, annual (default: monthly)
successUrlstringrequiredRedirect URL after successful checkout
cancelUrlstringrequiredRedirect URL if checkout is cancelled
200 OK
{
  "checkoutUrl": "https://checkout.stripe.com/c/pay/cs_live_...",
  "sessionId": "cs_live_..."
}
POST/api/v1/billing/portal

Generate a Stripe Customer Portal URL for managing the subscription, payment methods, and invoices.

200 OK
200 OK
{
  "portalUrl": "https://billing.stripe.com/p/session/..."
}
GET/api/v1/billing/status

Get the current subscription status, plan, and usage for the workspace.

200 OK
200 OK
{
  "plan": "standard",
  "status": "active",
  "interval": "monthly",
  "currentPeriodEnd": "2026-05-15T00:00:00Z",
  "seats": { "used": 5, "included": 10 },
  "usage": {
    "contacts": 342,
    "smsMessages": 1204,
    "emailMessages": 3891
  }
}

Dashboard

Get aggregated statistics for the workspace dashboard.

GET/api/v1/dashboard/stats

Retrieve dashboard statistics including contact counts, deal pipeline value, task status, and activity summary.

200 OK
ParameterDescription
periodstringoptionalTime period: 7d, 30d, 90d, ytd (default: 30d)
200 OK
{
  "contacts": { "total": 342, "new": 28, "trend": 0.12 },
  "deals": {
    "open": 42,
    "totalValue": 1840000,
    "wonThisPeriod": 8,
    "wonValue": 384000,
    "winRate": 0.38
  },
  "tasks": { "pending": 15, "overdue": 3, "completedThisPeriod": 47 },
  "messages": { "sent": 234, "received": 189, "responseRate": 0.72 },
  "period": "30d"
}

Authentication Endpoints

Session-based authentication for the web app. These endpoints are primarily used by the frontend, not API integrations.

POST/api/v1/auth/login

Authenticate with email and password. Returns a session token.

200 OK401 Invalid Credentials
FieldDescription
emailstringrequiredUser email address
passwordstringrequiredUser password
200 OK
{
  "token": "eyJhbGciOi...",
  "user": {
    "id": "usr_8f14e45f",
    "name": "David Park",
    "email": "dp@conduyt.app",
    "role": "admin"
  }
}
POST/api/v1/auth/register

Create a new account and workspace.

201 Created422 Validation
FieldDescription
namestringrequiredFull name
emailstringrequiredEmail address
passwordstringrequiredPassword (min 8 characters)
workspaceNamestringrequiredWorkspace name
POST/api/v1/auth/logout

Invalidate the current session token.

204 No Content
GET/api/v1/auth/me

Get the current authenticated user and workspace details.

200 OK401 Unauthorized
200 OK
{
  "user": {
    "id": "usr_8f14e45f",
    "name": "David Park",
    "email": "dp@conduyt.app",
    "role": "admin"
  },
  "workspace": {
    "id": "ws_01HXA1B2C",
    "name": "Conduyt HQ",
    "plan": "standard",
    "memberCount": 8
  }
}

Forms

Lead capture forms with customizable fields and settings. The public submission endpoint requires no authentication, making it ideal for embedding on external websites.

GET/api/v1/forms

List all forms in the workspace with submission counts.

200 OK401 Unauthorized
Query Parameters
ParameterDescription
pageintegeroptionalPage number (default: 1)
limitintegeroptionalItems per page (default: 50, max: 100)
searchstringoptionalSearch by form name
Response
200 OK
{
  "data": [
    {
      "id": "frm_a1b2c3d4-e5f6-7890-abcd-ef1234567890",
      "name": "Website Contact Form",
      "description": "Main lead capture form on the homepage",
      "fields": [
        { "key": "name", "label": "Full Name", "type": "text", "required": true },
        { "key": "email", "label": "Email", "type": "email", "required": true },
        { "key": "phone", "label": "Phone", "type": "phone", "required": false },
        { "key": "message", "label": "Message", "type": "textarea", "required": false }
      ],
      "settings": { "redirectUrl": "https://ritualandglass.com/thank-you", "notifyEmails": ["hello@ritualandglass.com"] },
      "submissionCount": 247,
      "createdAt": "2026-02-10T09:00:00Z",
      "updatedAt": "2026-04-18T11:30:00Z"
    }
  ],
  "meta": { "page": 1, "limit": 50, "total": 5, "totalPages": 1 }
}
Example
curl
curl -H "Authorization: Bearer cdy_your_api_key" \
  "https://conduyt.app/api/v1/forms"
POST/api/v1/forms

Create a new lead capture form with custom fields and settings.

201 Created422 Validation
Request Body
FieldDescription
namestringrequiredForm name (internal label)
descriptionstringoptionalDescription of the form's purpose
fieldsarrayrequiredArray of field definitions. Each field: key, label, type (text, email, phone, textarea, select, number), required (boolean), options (for select type)
settingsobjectoptionalForm settings: redirectUrl, notifyEmails (string[]), autoTag (tag name to apply), assignTo (user ID)
Example
curl
curl -X POST https://conduyt.app/api/v1/forms \
  -H "Authorization: Bearer cdy_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Free Consultation Request",
    "description": "Landing page form for consultation signups",
    "fields": [
      { "key": "name", "label": "Full Name", "type": "text", "required": true },
      { "key": "email", "label": "Email Address", "type": "email", "required": true },
      { "key": "phone", "label": "Phone", "type": "phone", "required": false },
      { "key": "service", "label": "Service Interested In", "type": "select", "required": true, "options": ["CRM Setup", "Data Migration", "Custom Integration"] }
    ],
    "settings": {
      "redirectUrl": "https://example.com/thank-you",
      "notifyEmails": ["sales@northwindclinical.com"],
      "autoTag": "consultation-request"
    }
  }'
GET/api/v1/forms/:id

Retrieve a single form by ID, including its field definitions and submission count.

200 OK404 Not Found
curl
curl -H "Authorization: Bearer cdy_your_api_key" \
  https://conduyt.app/api/v1/forms/frm_a1b2c3d4-e5f6-7890-abcd-ef1234567890
PATCH/api/v1/forms/:id

Update a form. Only include fields you want to change.

200 OK404 Not Found422 Validation
curl
curl -X PATCH https://conduyt.app/api/v1/forms/frm_a1b2c3d4... \
  -H "Authorization: Bearer cdy_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{ "name": "Updated Consultation Form", "settings": { "autoTag": "hot-lead" } }'
DELETE/api/v1/forms/:id

Delete a form and all its submissions. This action cannot be undone.

204 No Content404 Not Found
curl
curl -X DELETE -H "Authorization: Bearer cdy_your_api_key" \
  https://conduyt.app/api/v1/forms/frm_a1b2c3d4-e5f6-7890-abcd-ef1234567890
GET/api/v1/forms/:id/submissions

List all submissions for a form, paginated. Each submission includes the submitted data and the auto-created contact reference.

200 OK404 Not Found
Query Parameters
ParameterDescription
pageintegeroptionalPage number (default: 1)
limitintegeroptionalItems per page (default: 50, max: 100)
Response
200 OK
{
  "data": [
    {
      "id": "sub_9f8e7d6c-5b4a-3210-fedc-ba9876543210",
      "formId": "frm_a1b2c3d4-e5f6-7890-abcd-ef1234567890",
      "data": {
        "name": "Marcus Reeves",
        "email": "marcus@reevesconsulting.com",
        "phone": "+12125559900",
        "service": "CRM Setup"
      },
      "contactId": "550e8400-e29b-41d4-a716-446655440099",
      "submittedAt": "2026-04-18T14:22:00Z"
    }
  ],
  "meta": { "page": 1, "limit": 50, "total": 247, "totalPages": 5 }
}
Example
curl
curl -H "Authorization: Bearer cdy_your_api_key" \
  "https://conduyt.app/api/v1/forms/frm_a1b2c3d4.../submissions?limit=25"
POST/api/v1/forms/:id/submissions

Submit a form. This endpoint is public and requires no authentication. If the submitted data includes an email field, Conduyt automatically creates or matches an existing contact.

201 Created422 Validation404 Not Found
Request Body
FieldDescription
dataobjectrequiredKey-value pairs matching the form's field keys. Required fields must be present.
Example
curl · No auth required
curl -X POST https://conduyt.app/api/v1/forms/frm_a1b2c3d4.../submissions \
  -H "Content-Type: application/json" \
  -d '{
    "data": {
      "name": "Elena Vasquez",
      "email": "elena@luminadesigns.co",
      "phone": "+13055557788",
      "service": "Data Migration"
    }
  }'
Response
201 Created
{
  "data": {
    "id": "sub_1a2b3c4d-5e6f-7890-abcd-ef0987654321",
    "formId": "frm_a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "data": {
      "name": "Elena Vasquez",
      "email": "elena@luminadesigns.co",
      "phone": "+13055557788",
      "service": "Data Migration"
    },
    "contactId": "550e8400-e29b-41d4-a716-446655440100",
    "submittedAt": "2026-04-19T09:15:00Z"
  }
}

Products

Manage a product catalog for use in invoices. Products define line items with pricing, SKUs, and tax settings.

GET/api/v1/products

List all products with optional search and active/inactive filtering.

200 OK401 Unauthorized
Query Parameters
ParameterDescription
pageintegeroptionalPage number (default: 1)
limitintegeroptionalItems per page (default: 50, max: 100)
searchstringoptionalSearch by product name or SKU
activebooleanoptionalFilter by active status (true/false)
Response
200 OK
{
  "data": [
    {
      "id": "prod_7f8e9d0c-1b2a-3456-cdef-789012345678",
      "name": "CRM Setup & Configuration",
      "description": "Full CRM workspace setup, pipeline configuration, and team onboarding",
      "price": 2500.00,
      "sku": "SVC-SETUP-001",
      "unit": "project",
      "taxable": true,
      "active": true,
      "createdAt": "2026-01-15T08:00:00Z",
      "updatedAt": "2026-03-20T16:45:00Z"
    },
    {
      "id": "prod_6e5d4c3b-2a19-0987-fedc-ba6543210987",
      "name": "Monthly CRM Subscription",
      "description": "Standard tier monthly subscription with unlimited contacts",
      "price": 499.00,
      "sku": "SUB-STD-MO",
      "unit": "month",
      "taxable": true,
      "active": true,
      "createdAt": "2026-01-15T08:00:00Z",
      "updatedAt": "2026-01-15T08:00:00Z"
    }
  ],
  "meta": { "page": 1, "limit": 50, "total": 12, "totalPages": 1 }
}
Example
curl
curl -H "Authorization: Bearer cdy_your_api_key" \
  "https://conduyt.app/api/v1/products?active=true&search=CRM"
POST/api/v1/products

Create a new product in the catalog.

201 Created422 Validation
Request Body
FieldDescription
namestringrequiredProduct name
descriptionstringoptionalProduct description
pricenumberrequiredUnit price in dollars
skustringoptionalStock keeping unit identifier
unitstringoptionalUnit of measure (e.g., hour, project, month, each)
taxablebooleanoptionalWhether tax applies (default: true)
Example
curl
curl -X POST https://conduyt.app/api/v1/products \
  -H "Authorization: Bearer cdy_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Custom API Integration",
    "description": "Build and deploy a custom integration with third-party systems",
    "price": 3500.00,
    "sku": "SVC-INT-001",
    "unit": "project",
    "taxable": true
  }'
GET/api/v1/products/:id

Retrieve a single product by ID.

200 OK404 Not Found
curl
curl -H "Authorization: Bearer cdy_your_api_key" \
  https://conduyt.app/api/v1/products/prod_7f8e9d0c-1b2a-3456-cdef-789012345678
PATCH/api/v1/products/:id

Update a product. Only include fields you want to change.

200 OK404 Not Found422 Validation
curl
curl -X PATCH https://conduyt.app/api/v1/products/prod_7f8e9d0c... \
  -H "Authorization: Bearer cdy_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{ "price": 2750.00, "description": "Updated: includes 2 hours of training" }'
DELETE/api/v1/products/:id

Delete a product. Products referenced in existing invoices will remain on those invoices but can no longer be used in new ones.

204 No Content404 Not Found
curl
curl -X DELETE -H "Authorization: Bearer cdy_your_api_key" \
  https://conduyt.app/api/v1/products/prod_7f8e9d0c-1b2a-3456-cdef-789012345678

Invoices

Create, send, and track invoices with line items. Invoices auto-calculate subtotals, tax, and totals. Record payments against invoices to track outstanding balances.

GET/api/v1/invoices

List all invoices with optional filters for status, contact, and date range.

200 OK401 Unauthorized
Query Parameters
ParameterDescription
pageintegeroptionalPage number (default: 1)
limitintegeroptionalItems per page (default: 50, max: 100)
statusstringoptionalFilter by status: draft, sent, paid, overdue, void
contactIduuidoptionalFilter by contact ID
due_afterISO 8601optionalInvoices due after this date
due_beforeISO 8601optionalInvoices due before this date
Response
200 OK
{
  "data": [
    {
      "id": "inv_550e8400-e29b-41d4-a716-446655440000",
      "invoiceNumber": "INV-001",
      "status": "sent",
      "contact": { "id": "con_8f14e45f", "firstName": "Sarah", "lastName": "Kim" },
      "subtotal": 3997.00,
      "taxRate": 0.0875,
      "taxAmount": 349.74,
      "total": 4346.74,
      "amountPaid": 0,
      "dueDate": "2026-05-19",
      "createdAt": "2026-04-19T10:00:00Z",
      "updatedAt": "2026-04-19T10:30:00Z"
    }
  ],
  "meta": { "page": 1, "limit": 50, "total": 28, "totalPages": 1 }
}
Example
curl
curl -H "Authorization: Bearer cdy_your_api_key" \
  "https://conduyt.app/api/v1/invoices?status=sent&due_before=2026-05-31"
POST/api/v1/invoices

Create a new invoice with line items. Totals are auto-calculated from item quantities and unit prices.

201 Created422 Validation
Request Body
FieldDescription
contactIduuidrequiredContact to invoice
itemsarrayrequiredLine items. Each: description (string), quantity (number), unitPrice (number), optional productId (uuid)
taxRatenumberoptionalTax rate as decimal (e.g., 0.0875 for 8.75%). Default: workspace setting.
dueDateISO 8601optionalPayment due date. Default: 30 days from creation.
notesstringoptionalNotes displayed on the invoice
Example
curl
curl -X POST https://conduyt.app/api/v1/invoices \
  -H "Authorization: Bearer cdy_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "contactId": "con_8f14e45f",
    "items": [
      { "description": "CRM Setup & Configuration", "quantity": 1, "unitPrice": 2500.00, "productId": "prod_7f8e9d0c..." },
      { "description": "Monthly Subscription (3 months)", "quantity": 3, "unitPrice": 499.00 }
    ],
    "taxRate": 0.0875,
    "dueDate": "2026-05-19",
    "notes": "Thank you for choosing Conduyt. Payment due within 30 days."
  }'
Response
201 Created
{
  "data": {
    "id": "inv_550e8400-e29b-41d4-a716-446655440000",
    "invoiceNumber": "INV-001",
    "status": "draft",
    "contact": { "id": "con_8f14e45f", "firstName": "Sarah", "lastName": "Kim" },
    "items": [
      { "id": "li_001", "description": "CRM Setup & Configuration", "quantity": 1, "unitPrice": 2500.00, "amount": 2500.00 },
      { "id": "li_002", "description": "Monthly Subscription (3 months)", "quantity": 3, "unitPrice": 499.00, "amount": 1497.00 }
    ],
    "subtotal": 3997.00,
    "taxRate": 0.0875,
    "taxAmount": 349.74,
    "total": 4346.74,
    "amountPaid": 0,
    "dueDate": "2026-05-19",
    "notes": "Thank you for choosing Conduyt. Payment due within 30 days.",
    "payments": [],
    "createdAt": "2026-04-19T10:00:00Z",
    "updatedAt": "2026-04-19T10:00:00Z"
  }
}
GET/api/v1/invoices/:id

Retrieve a single invoice with all line items and payment history.

200 OK404 Not Found
Response
200 OK
{
  "data": {
    "id": "inv_550e8400-e29b-41d4-a716-446655440000",
    "invoiceNumber": "INV-001",
    "status": "sent",
    "contact": { "id": "con_8f14e45f", "firstName": "Sarah", "lastName": "Kim" },
    "items": [
      { "id": "li_001", "description": "CRM Setup & Configuration", "quantity": 1, "unitPrice": 2500.00, "amount": 2500.00 },
      { "id": "li_002", "description": "Monthly Subscription (3 months)", "quantity": 3, "unitPrice": 499.00, "amount": 1497.00 }
    ],
    "subtotal": 3997.00,
    "taxRate": 0.0875,
    "taxAmount": 349.74,
    "total": 4346.74,
    "amountPaid": 0,
    "dueDate": "2026-05-19",
    "notes": "Thank you for choosing Conduyt. Payment due within 30 days.",
    "payments": [],
    "createdAt": "2026-04-19T10:00:00Z",
    "updatedAt": "2026-04-19T10:30:00Z"
  }
}
Example
curl
curl -H "Authorization: Bearer cdy_your_api_key" \
  https://conduyt.app/api/v1/invoices/inv_550e8400-e29b-41d4-a716-446655440000
PATCH/api/v1/invoices/:id

Update a draft invoice. Sent and paid invoices cannot be edited. Void and recreate instead.

200 OK404 Not Found422 Validation409 Conflict
curl
curl -X PATCH https://conduyt.app/api/v1/invoices/inv_550e8400... \
  -H "Authorization: Bearer cdy_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{ "dueDate": "2026-06-01", "notes": "Extended payment terms — NET 45" }'
POST/api/v1/invoices/:id/send

Mark an invoice as sent. Changes status from "draft" to "sent" and records the sent timestamp.

200 OK404 Not Found409 Conflict
curl
curl -X POST -H "Authorization: Bearer cdy_your_api_key" \
  https://conduyt.app/api/v1/invoices/inv_550e8400.../send
Response
200 OK
{
  "data": {
    "id": "inv_550e8400-e29b-41d4-a716-446655440000",
    "invoiceNumber": "INV-001",
    "status": "sent",
    "sentAt": "2026-04-19T10:30:00Z"
  }
}
POST/api/v1/invoices/:id/void

Void an invoice. Voided invoices cannot be edited or paid. This action cannot be undone.

200 OK404 Not Found409 Conflict
curl
curl -X POST -H "Authorization: Bearer cdy_your_api_key" \
  https://conduyt.app/api/v1/invoices/inv_550e8400.../void
GET/api/v1/invoices/:id/payments

List all payments recorded against an invoice.

200 OK404 Not Found
Response
200 OK
{
  "data": [
    {
      "id": "pay_d4c3b2a1-0987-6543-fedc-ba0987654321",
      "invoiceId": "inv_550e8400-e29b-41d4-a716-446655440000",
      "amount": 2500.00,
      "method": "bank_transfer",
      "reference": "Wire ref #4821",
      "notes": "Partial payment — setup fee",
      "recordedAt": "2026-04-25T14:00:00Z",
      "recordedBy": "usr_8f14e45f"
    }
  ]
}
Example
curl
curl -H "Authorization: Bearer cdy_your_api_key" \
  https://conduyt.app/api/v1/invoices/inv_550e8400.../payments
POST/api/v1/invoices/:id/payments

Record a payment against an invoice. Automatically updates the invoice's amountPaid and transitions status to "paid" when fully paid.

201 Created422 Validation409 Conflict
Request Body
FieldDescription
amountnumberrequiredPayment amount in dollars
methodstringoptionalPayment method: credit_card, bank_transfer, check, cash, other
referencestringoptionalExternal reference (check number, wire ref, etc.)
notesstringoptionalInternal notes about this payment
Example
curl
curl -X POST https://conduyt.app/api/v1/invoices/inv_550e8400.../payments \
  -H "Authorization: Bearer cdy_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "amount": 1846.74,
    "method": "credit_card",
    "reference": "ch_3Oa1b2c3d4e5f6",
    "notes": "Final payment — balance cleared"
  }'
Response
201 Created
{
  "data": {
    "id": "pay_e5d4c3b2-a109-8765-4321-fedcba098765",
    "invoiceId": "inv_550e8400-e29b-41d4-a716-446655440000",
    "amount": 1846.74,
    "method": "credit_card",
    "reference": "ch_3Oa1b2c3d4e5f6",
    "notes": "Final payment — balance cleared",
    "recordedAt": "2026-04-28T09:15:00Z",
    "recordedBy": "usr_8f14e45f"
  },
  "invoice": {
    "id": "inv_550e8400-e29b-41d4-a716-446655440000",
    "status": "paid",
    "total": 4346.74,
    "amountPaid": 4346.74
  }
}

Email Templates

Create and manage reusable email templates with merge fields for personalized outreach. Templates support HTML content and dynamic placeholders like {{contact.firstName}} and {{contact.company}}.

GET/api/v1/emails/templates

List all email templates in the workspace.

200 OK401 Unauthorized
Query Parameters
ParameterDescription
pageintegeroptionalPage number (default: 1)
limitintegeroptionalItems per page (default: 50, max: 100)
searchstringoptionalSearch by template name or subject
Response
200 OK
{
  "data": [
    {
      "id": "tmpl_a1b2c3d4-5678-9012-abcd-ef3456789012",
      "name": "Welcome — New Client Onboarding",
      "subject": "Welcome to {{workspace.name}}, {{contact.firstName}}!",
      "bodyHtml": "<h1>Welcome aboard, {{contact.firstName}}!</h1><p>We're excited to have {{contact.company}} as a client...</p>",
      "bodyText": "Welcome aboard, {{contact.firstName}}! We're excited to have {{contact.company}} as a client...",
      "mergeFields": ["contact.firstName", "contact.company", "workspace.name"],
      "createdAt": "2026-03-01T12:00:00Z",
      "updatedAt": "2026-04-10T09:30:00Z"
    }
  ],
  "meta": { "page": 1, "limit": 50, "total": 8, "totalPages": 1 }
}
Example
curl
curl -H "Authorization: Bearer cdy_your_api_key" \
  "https://conduyt.app/api/v1/emails/templates?search=welcome"
POST/api/v1/emails/templates

Create a new email template with HTML content and merge fields.

201 Created422 Validation
Request Body
FieldDescription
namestringrequiredInternal template name
subjectstringrequiredEmail subject line (supports merge fields)
bodyHtmlstringrequiredHTML email body (supports merge fields)
bodyTextstringoptionalPlain text fallback. Auto-generated from HTML if omitted.
Example
curl
curl -X POST https://conduyt.app/api/v1/emails/templates \
  -H "Authorization: Bearer cdy_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Follow-Up — Meeting Recap",
    "subject": "Great meeting, {{contact.firstName}} — next steps",
    "bodyHtml": "<p>Hi {{contact.firstName}},</p><p>Thanks for meeting with us today. Here are the next steps we discussed...</p>"
  }'
GET/api/v1/emails/templates/:id

Retrieve a single email template by ID.

200 OK404 Not Found
curl
curl -H "Authorization: Bearer cdy_your_api_key" \
  https://conduyt.app/api/v1/emails/templates/tmpl_a1b2c3d4-5678-9012-abcd-ef3456789012
PATCH/api/v1/emails/templates/:id

Update an email template. Only include fields you want to change.

200 OK404 Not Found422 Validation
curl
curl -X PATCH https://conduyt.app/api/v1/emails/templates/tmpl_a1b2c3d4... \
  -H "Authorization: Bearer cdy_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{ "subject": "Next steps for {{contact.company}}" }'
DELETE/api/v1/emails/templates/:id

Delete an email template. Templates in use by active sequences cannot be deleted. Deactivate the sequence first.

204 No Content404 Not Found409 Conflict
curl
curl -X DELETE -H "Authorization: Bearer cdy_your_api_key" \
  https://conduyt.app/api/v1/emails/templates/tmpl_a1b2c3d4-5678-9012-abcd-ef3456789012

Email Sequences

Automated multi-step email sequences. Define a series of timed emails, enroll contacts, and track engagement across the drip campaign.

GET/api/v1/emails/sequences

List all email sequences with enrollment stats.

200 OK401 Unauthorized
Response
200 OK
{
  "data": [
    {
      "id": "seq_b2c3d4e5-f6a7-8901-bcde-f23456789012",
      "name": "New Client Onboarding Drip",
      "status": "active",
      "steps": [
        { "order": 1, "templateId": "tmpl_a1b2c3d4...", "delayDays": 0, "subject": "Welcome to Conduyt!" },
        { "order": 2, "templateId": "tmpl_e5f6a7b8...", "delayDays": 3, "subject": "Getting started with pipelines" },
        { "order": 3, "templateId": "tmpl_c9d0e1f2...", "delayDays": 7, "subject": "Pro tips from our team" }
      ],
      "enrolledCount": 142,
      "completedCount": 98,
      "activeCount": 44,
      "createdAt": "2026-02-15T10:00:00Z",
      "updatedAt": "2026-04-18T08:00:00Z"
    }
  ],
  "meta": { "page": 1, "limit": 50, "total": 4, "totalPages": 1 }
}
Example
curl
curl -H "Authorization: Bearer cdy_your_api_key" \
  "https://conduyt.app/api/v1/emails/sequences"
POST/api/v1/emails/sequences

Create a new email sequence with ordered steps. Each step references a template and a delay (in days) from enrollment.

201 Created422 Validation
Request Body
FieldDescription
namestringrequiredSequence name
stepsarrayrequiredOrdered steps. Each: templateId (uuid), delayDays (integer, days after enrollment), optional subject override
Example
curl
curl -X POST https://conduyt.app/api/v1/emails/sequences \
  -H "Authorization: Bearer cdy_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Trial Nurture Sequence",
    "steps": [
      { "templateId": "tmpl_a1b2c3d4...", "delayDays": 0, "subject": "Welcome to your trial!" },
      { "templateId": "tmpl_e5f6a7b8...", "delayDays": 2, "subject": "Did you set up your first pipeline?" },
      { "templateId": "tmpl_c9d0e1f2...", "delayDays": 5 },
      { "templateId": "tmpl_g1h2i3j4...", "delayDays": 12, "subject": "Your trial ends in 2 days" }
    ]
  }'
GET/api/v1/emails/sequences/:id

Retrieve a single sequence with its steps and enrollment statistics.

200 OK404 Not Found
curl
curl -H "Authorization: Bearer cdy_your_api_key" \
  https://conduyt.app/api/v1/emails/sequences/seq_b2c3d4e5-f6a7-8901-bcde-f23456789012
PATCH/api/v1/emails/sequences/:id

Update a sequence. Modifying steps on an active sequence only affects future enrollments. Contacts already in progress continue on the original steps.

200 OK404 Not Found422 Validation
curl
curl -X PATCH https://conduyt.app/api/v1/emails/sequences/seq_b2c3d4e5... \
  -H "Authorization: Bearer cdy_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{ "name": "Updated Onboarding Drip" }'
POST/api/v1/emails/sequences/:id/enroll

Enroll one or more contacts into a sequence. Contacts already enrolled are silently skipped.

200 OK404 Not Found422 Validation
Request Body
FieldDescription
contactIdsuuid[]requiredArray of contact IDs to enroll (max 100 per request)
Example
curl
curl -X POST https://conduyt.app/api/v1/emails/sequences/seq_b2c3d4e5.../enroll \
  -H "Authorization: Bearer cdy_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{ "contactIds": ["con_8f14e45f", "con_9a25f56g", "con_0b36g67h"] }'
Response
200 OK
{
  "enrolled": 2,
  "skipped": 1,
  "details": [
    { "contactId": "con_8f14e45f", "status": "enrolled" },
    { "contactId": "con_9a25f56g", "status": "enrolled" },
    { "contactId": "con_0b36g67h", "status": "skipped", "reason": "already_enrolled" }
  ]
}
POST/api/v1/emails/sequences/:id/unenroll

Remove a contact from a sequence. Stops all future emails in the sequence for this contact.

200 OK404 Not Found
Request Body
FieldDescription
contactIduuidrequiredContact ID to unenroll
Example
curl
curl -X POST https://conduyt.app/api/v1/emails/sequences/seq_b2c3d4e5.../unenroll \
  -H "Authorization: Bearer cdy_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{ "contactId": "con_8f14e45f" }'
GET/api/v1/emails/sequences/:id/enrollments

List all enrollments for a sequence, including current step and completion status.

200 OK404 Not Found
Query Parameters
ParameterDescription
statusstringoptionalFilter by enrollment status: active, completed, unenrolled
pageintegeroptionalPage number (default: 1)
limitintegeroptionalItems per page (default: 50, max: 100)
Response
200 OK
{
  "data": [
    {
      "id": "enr_c3d4e5f6-a7b8-9012-cdef-345678901234",
      "contactId": "con_8f14e45f",
      "contact": { "firstName": "Marcus", "lastName": "Reeves", "email": "marcus@reevesconsulting.com" },
      "status": "active",
      "currentStep": 2,
      "totalSteps": 3,
      "enrolledAt": "2026-04-15T10:00:00Z",
      "lastEmailSentAt": "2026-04-18T10:00:00Z",
      "nextEmailAt": "2026-04-22T10:00:00Z"
    }
  ],
  "meta": { "page": 1, "limit": 50, "total": 44, "totalPages": 1 }
}
Example
curl
curl -H "Authorization: Bearer cdy_your_api_key" \
  "https://conduyt.app/api/v1/emails/sequences/seq_b2c3d4e5.../enrollments?status=active"

Calls

Log and track phone calls with contacts. Calls appear in the contact's activity timeline and can be filtered by direction, status, user, and date range.

GET/api/v1/calls

List all logged calls with optional filters.

200 OK401 Unauthorized
Query Parameters
ParameterDescription
pageintegeroptionalPage number (default: 1)
limitintegeroptionalItems per page (default: 50, max: 100)
contactIduuidoptionalFilter by contact ID
userIduuidoptionalFilter by user who made/received the call
directionstringoptionalFilter by direction: inbound, outbound
statusstringoptionalFilter by status: completed, missed, voicemail, no_answer
afterISO 8601optionalCalls after this date
beforeISO 8601optionalCalls before this date
Response
200 OK
{
  "data": [
    {
      "id": "call_d4e5f6a7-b8c9-0123-def4-567890123456",
      "contactId": "con_8f14e45f",
      "contact": { "firstName": "Sarah", "lastName": "Kim" },
      "userId": "usr_8f14e45f",
      "user": { "name": "David Park" },
      "direction": "outbound",
      "status": "completed",
      "duration": 342,
      "notes": "Discussed CRM migration timeline. Sarah confirmed Q2 start. Follow up with SOW by Friday.",
      "startedAt": "2026-04-18T15:30:00Z",
      "endedAt": "2026-04-18T15:35:42Z",
      "createdAt": "2026-04-18T15:35:42Z"
    }
  ],
  "meta": { "page": 1, "limit": 50, "total": 89, "totalPages": 2 }
}
Example
curl
curl -H "Authorization: Bearer cdy_your_api_key" \
  "https://conduyt.app/api/v1/calls?direction=outbound&status=completed&after=2026-04-01"
POST/api/v1/calls

Log a new call. Creates an entry in the contact's activity timeline.

201 Created422 Validation
Request Body
FieldDescription
contactIduuidrequiredContact the call is with
directionstringrequiredCall direction: inbound or outbound
statusstringrequiredCall outcome: completed, missed, voicemail, no_answer
durationintegeroptionalCall duration in seconds
notesstringoptionalCall notes or summary
startedAtISO 8601optionalWhen the call started (defaults to now)
Example
curl
curl -X POST https://conduyt.app/api/v1/calls \
  -H "Authorization: Bearer cdy_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "contactId": "con_8f14e45f",
    "direction": "outbound",
    "status": "completed",
    "duration": 480,
    "notes": "Demo call with Northwind Clinical. Showed pipeline + automation features. They want a proposal by next week.",
    "startedAt": "2026-04-19T14:00:00Z"
  }'
GET/api/v1/calls/:id

Retrieve a single call log entry by ID.

200 OK404 Not Found
curl
curl -H "Authorization: Bearer cdy_your_api_key" \
  https://conduyt.app/api/v1/calls/call_d4e5f6a7-b8c9-0123-def4-567890123456
PATCH/api/v1/calls/:id

Update a call log entry. Commonly used to add notes after a call or correct the status.

200 OK404 Not Found422 Validation
curl
curl -X PATCH https://conduyt.app/api/v1/calls/call_d4e5f6a7... \
  -H "Authorization: Bearer cdy_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{ "notes": "Updated: Sarah confirmed budget approval. Moving to negotiation stage.", "status": "completed" }'

Workflows

Advanced workflow automation with event-driven triggers and configurable actions. Define workflows that fire on CRM events (contact created, deal stage changed, form submitted) and execute actions like sending emails, creating tasks, or updating fields. Monitor execution with the runs API.

GET/api/v1/workflows

List all workflows in the workspace.

200 OK401 Unauthorized
Query Parameters
ParameterDescription
pageintegeroptionalPage number (default: 1)
limitintegeroptionalItems per page (default: 50, max: 100)
statusstringoptionalFilter by status: active, inactive
Response
200 OK
{
  "data": [
    {
      "id": "wf_e5f6a7b8-c9d0-1234-ef56-789012345678",
      "name": "New Lead Auto-Assignment",
      "description": "Assigns new leads from the website form to the sales team round-robin",
      "status": "active",
      "trigger": {
        "event": "contact.created",
        "conditions": { "source": "website" }
      },
      "actions": [
        { "type": "assign_contact", "config": { "strategy": "round_robin", "teamId": "team_sales" } },
        { "type": "send_email", "config": { "templateId": "tmpl_a1b2c3d4...", "delay": 0 } },
        { "type": "create_task", "config": { "title": "Follow up with new lead", "dueDays": 1 } }
      ],
      "runCount": 312,
      "lastRunAt": "2026-04-19T08:15:00Z",
      "createdAt": "2026-02-01T10:00:00Z",
      "updatedAt": "2026-04-10T14:00:00Z"
    }
  ],
  "meta": { "page": 1, "limit": 50, "total": 6, "totalPages": 1 }
}
Example
curl
curl -H "Authorization: Bearer cdy_your_api_key" \
  "https://conduyt.app/api/v1/workflows?status=active"
POST/api/v1/workflows

Create a new workflow with a trigger event and one or more actions. Workflows are created in "inactive" status by default. Activate explicitly when ready.

201 Created422 Validation
Request Body
FieldDescription
namestringrequiredWorkflow name
descriptionstringoptionalDescription of what this workflow does
triggerobjectrequiredTrigger definition: event (string — e.g., contact.created, deal.stage_changed, form.submitted), optional conditions (object)
actionsarrayrequiredOrdered actions. Each: type (assign_contact, send_email, create_task, update_field, send_webhook, enroll_sequence), config (object)
Example
curl
curl -X POST https://conduyt.app/api/v1/workflows \
  -H "Authorization: Bearer cdy_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Deal Won — Send Thank You",
    "description": "Sends a thank-you email and creates a follow-up task when a deal is won",
    "trigger": {
      "event": "deal.stage_changed",
      "conditions": { "stageName": "Closed Won" }
    },
    "actions": [
      { "type": "send_email", "config": { "templateId": "tmpl_thankyou...", "delay": 0 } },
      { "type": "create_task", "config": { "title": "Schedule kickoff call", "dueDays": 2, "assignTo": "deal.owner" } }
    ]
  }'
GET/api/v1/workflows/:id

Retrieve a single workflow with its trigger, actions, and run statistics.

200 OK404 Not Found
curl
curl -H "Authorization: Bearer cdy_your_api_key" \
  https://conduyt.app/api/v1/workflows/wf_e5f6a7b8-c9d0-1234-ef56-789012345678
PATCH/api/v1/workflows/:id

Update a workflow. Active workflows can be updated. Changes take effect on the next trigger event.

200 OK404 Not Found422 Validation
curl
curl -X PATCH https://conduyt.app/api/v1/workflows/wf_e5f6a7b8... \
  -H "Authorization: Bearer cdy_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{ "name": "Deal Won — Full Onboarding Flow", "description": "Updated to include sequence enrollment" }'
DELETE/api/v1/workflows/:id

Delete a workflow. Active workflows must be deactivated before deletion.

204 No Content404 Not Found409 Conflict
curl
curl -X DELETE -H "Authorization: Bearer cdy_your_api_key" \
  https://conduyt.app/api/v1/workflows/wf_e5f6a7b8-c9d0-1234-ef56-789012345678
POST/api/v1/workflows/:id/activate

Activate a workflow. Once active, the workflow will fire on matching trigger events.

200 OK404 Not Found409 Conflict
curl
curl -X POST -H "Authorization: Bearer cdy_your_api_key" \
  https://conduyt.app/api/v1/workflows/wf_e5f6a7b8.../activate
Response
200 OK
{
  "data": {
    "id": "wf_e5f6a7b8-c9d0-1234-ef56-789012345678",
    "name": "Deal Won — Full Onboarding Flow",
    "status": "active",
    "activatedAt": "2026-04-19T12:00:00Z"
  }
}
POST/api/v1/workflows/:id/deactivate

Deactivate a workflow. Stops it from firing on new events. In-flight runs continue to completion.

200 OK404 Not Found
curl
curl -X POST -H "Authorization: Bearer cdy_your_api_key" \
  https://conduyt.app/api/v1/workflows/wf_e5f6a7b8.../deactivate
GET/api/v1/workflows/:id/runs

List execution history for a workflow. Each run represents one trigger event and the resulting action executions.

200 OK404 Not Found
Query Parameters
ParameterDescription
pageintegeroptionalPage number (default: 1)
limitintegeroptionalItems per page (default: 50, max: 100)
statusstringoptionalFilter by run status: success, failed, running
Response
200 OK
{
  "data": [
    {
      "id": "run_f6a7b8c9-d0e1-2345-6789-0abcdef01234",
      "workflowId": "wf_e5f6a7b8-c9d0-1234-ef56-789012345678",
      "status": "success",
      "triggerEvent": "deal.stage_changed",
      "triggerData": { "dealId": "deal_01HX7Q5CA...", "dealName": "Ritual & Glass — CRM Migration", "newStage": "Closed Won" },
      "actions": [
        { "type": "send_email", "status": "success", "executedAt": "2026-04-19T08:15:01Z" },
        { "type": "create_task", "status": "success", "executedAt": "2026-04-19T08:15:02Z" }
      ],
      "startedAt": "2026-04-19T08:15:00Z",
      "completedAt": "2026-04-19T08:15:02Z",
      "durationMs": 2100
    }
  ],
  "meta": { "page": 1, "limit": 50, "total": 312, "totalPages": 7 }
}
Example
curl
curl -H "Authorization: Bearer cdy_your_api_key" \
  "https://conduyt.app/api/v1/workflows/wf_e5f6a7b8.../runs?status=failed&limit=10"
GET/api/v1/workflows/:id/runs/:runId

Get full details of a specific workflow run, including per-action results and any error messages.

200 OK404 Not Found
Response
200 OK
{
  "data": {
    "id": "run_f6a7b8c9-d0e1-2345-6789-0abcdef01234",
    "workflowId": "wf_e5f6a7b8-c9d0-1234-ef56-789012345678",
    "workflowName": "Deal Won — Full Onboarding Flow",
    "status": "success",
    "triggerEvent": "deal.stage_changed",
    "triggerData": {
      "dealId": "deal_01HX7Q5CA...",
      "dealName": "Ritual & Glass — CRM Migration",
      "contactId": "con_8f14e45f",
      "previousStage": "Proposal",
      "newStage": "Closed Won",
      "dealValue": 18500
    },
    "actions": [
      {
        "type": "send_email",
        "status": "success",
        "config": { "templateId": "tmpl_thankyou..." },
        "result": { "messageId": "msg_abc123", "recipient": "sarah.kim@acme.com" },
        "executedAt": "2026-04-19T08:15:01Z"
      },
      {
        "type": "create_task",
        "status": "success",
        "config": { "title": "Schedule kickoff call", "dueDays": 2 },
        "result": { "taskId": "task_def456" },
        "executedAt": "2026-04-19T08:15:02Z"
      }
    ],
    "startedAt": "2026-04-19T08:15:00Z",
    "completedAt": "2026-04-19T08:15:02Z",
    "durationMs": 2100
  }
}
Example
curl
curl -H "Authorization: Bearer cdy_your_api_key" \
  https://conduyt.app/api/v1/workflows/wf_e5f6a7b8.../runs/run_f6a7b8c9-d0e1-2345-6789-0abcdef01234

Need help integrating?

Check out the developer guides for step-by-step walkthroughs, or reach out to our team.