API Reference.
Every endpoint.
Complete REST API documentation for Conduyt CRM. Parameters, response schemas, and curl examples for every endpoint.
API Reference
The same endpoints that power the Conduyt web app. Every request requires a Bearer token. All responses return JSON.
Authentication
All requests require a Bearer token in the Authorization header. Generate API keys in Settings → API. Keys are prefixed with cdy_.
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": {
"code": "validation_failed",
"message": "The request body contains invalid fields.",
"details": [
{ "field": "email", "message": "Must be a valid email address" }
]
}
}| Status | Code | Description |
|---|---|---|
400 | invalid_request | Malformed request body or query |
401 | unauthenticated | Missing or invalid API key |
403 | permission_denied | Key lacks required scope |
404 | not_found | Resource does not exist |
422 | validation_failed | Semantic validation error |
429 | rate_limited | Rate limit exceeded |
500 | internal_error | Server error — retry |
Contacts
Manage contacts in your CRM. Contacts represent people your team interacts with: leads, customers, partners.
List all contacts with optional filters and pagination.
| Parameter | Description |
|---|---|
pageintegeroptional | Page number (default: 1) |
limitintegeroptional | Items per page (default: 50, max: 100) |
searchstringoptional | Search by name, email, or phone |
tagstringoptional | Filter by tag name |
sourcestringoptional | Filter by lead source |
assigned_touuidoptional | Filter by assigned user ID |
created_afterISO 8601optional | Contacts created after this date |
created_beforeISO 8601optional | Contacts created before this date |
{
"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 }
}curl -H "Authorization: Bearer cdy_your_api_key" \ "https://conduyt.app/api/v1/contacts?search=sarah&limit=10"
Create a new contact in the workspace.
| Field | Description |
|---|---|
firstNamestringrequired | Contact first name |
lastNamestringrequired | Contact last name |
emailstringoptional | Email address |
phonestringoptional | Phone number (E.164 format) |
companystringoptional | Company name |
sourcestringoptional | Lead source (e.g., website, referral, ad) |
tagsstring[]optional | Array of tag names to apply |
assignedTouuidoptional | User ID to assign this contact to |
customFieldsobjectoptional | Key-value pairs for custom fields |
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"]
}'Retrieve a single contact by ID. Returns the full contact object including custom fields and tags.
curl -H "Authorization: Bearer cdy_your_api_key" \ https://conduyt.app/api/v1/contacts/550e8400-e29b-41d4-a716-446655440000
Update a contact. Only include fields you want to change. Unspecified fields are left unchanged.
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" }'Permanently delete a contact and all associated data (notes, tasks, conversations). This action cannot be undone.
curl -X DELETE -H "Authorization: Bearer cdy_your_api_key" \ https://conduyt.app/api/v1/contacts/550e8400-...
Add one or more tags to a contact. Tags are created automatically if they do not already exist.
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"] }'Remove a specific tag from a contact.
curl -X DELETE -H "Authorization: Bearer cdy_your_api_key" \ https://conduyt.app/api/v1/contacts/550e8400-.../tags/tag_abc123
Import contacts from a CSV file or JSON array. Deduplication is performed on email address. Existing contacts are updated; new contacts are created.
| Field | Description |
|---|---|
contactsobject[]required | Array of contact objects (max 1,000 per request) |
tagsstring[]optional | Tags to apply to all imported contacts |
sourcestringoptional | Lead source to assign to all imported contacts |
{
"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.
List all companies with optional search and pagination.
| Parameter | Description |
|---|---|
pageintegeroptional | Page number (default: 1) |
limitintegeroptional | Items per page (default: 50, max: 100) |
searchstringoptional | Search by company name |
{
"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 }
}Create a new company.
| Field | Description |
|---|---|
namestringrequired | Company name |
domainstringoptional | Website domain |
industrystringoptional | Industry classification |
sizestringoptional | Company size (1-10, 11-50, 51-200, 201-500, 500+) |
addressobjectoptional | Address object with street, city, state, zip, country |
Retrieve a single company by ID, including linked contacts.
Update company fields. Only include fields you want to change.
Delete a company. Linked contacts are not deleted but the association is removed.
Deals
Manage deals in your pipeline. Deals represent potential revenue and track through stages from qualification to close.
List all deals with optional filters. Results are ordered by updated_at descending by default.
| Parameter | Description |
|---|---|
pageintegeroptional | Page number (default: 1) |
limitintegeroptional | Items per page (default: 50, max: 100) |
pipelineIdstringoptional | Filter by pipeline ID |
stageIdstringoptional | Filter by stage ID |
assignedTouuidoptional | Filter by assigned user ID |
statusstringoptional | Filter by status: open, won, lost |
{
"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 }
}Create a new deal in a pipeline.
| Field | Description |
|---|---|
namestringrequired | Deal name |
valuenumberrequired | Deal value in cents or whole units |
pipelineIdstringrequired | Pipeline to place the deal in |
stageIdstringrequired | Initial stage within the pipeline |
contactIduuidoptional | Associated contact ID |
companyIdstringoptional | Associated company ID |
assignedTouuidoptional | User ID to own this deal |
expectedCloseDatedateoptional | Expected close date (YYYY-MM-DD) |
customFieldsobjectoptional | Key-value pairs for custom fields |
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"
}'Retrieve a single deal by ID, including pipeline, stage, contact, and company details.
Update a deal. Move between stages by changing stageId. Changing status to "won" or "lost" closes the deal.
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.
List all pipelines in the workspace.
{
"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 }
}Create a new pipeline with initial stages.
| Field | Description |
|---|---|
namestringrequired | Pipeline name |
stagesobject[]optional | Array of stage objects with name, order, and probability |
Retrieve a pipeline with its stages and summary statistics.
Update pipeline name or settings.
List all stages in a pipeline, ordered by position.
{
"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 }
]
}Add a new stage to a pipeline.
| Field | Description |
|---|---|
namestringrequired | Stage name |
orderintegerrequired | Position in the pipeline |
probabilitynumberoptional | Win probability (0.0 to 1.0) |
Update a stage name, position, or probability.
Tasks
Manage tasks assigned to team members. Tasks can be linked to contacts or deals.
List all tasks with optional filters for status, assignee, and due date.
| Parameter | Description |
|---|---|
statusstringoptional | Filter: pending, completed, overdue |
assignedTouuidoptional | Filter by assigned user |
contactIduuidoptional | Filter by linked contact |
dealIdstringoptional | Filter by linked deal |
due_beforeISO 8601optional | Tasks due before this date |
{
"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 }
}Create a new task.
| Field | Description |
|---|---|
titlestringrequired | Task title |
descriptionstringoptional | Task description |
dueDateISO 8601optional | Due date and time |
prioritystringoptional | Priority: low, medium, high |
assignedTouuidoptional | Assigned user ID |
contactIduuidoptional | Link to a contact |
dealIdstringoptional | Link to a deal |
Retrieve a single task by ID.
Update a task. Set status to "completed" to mark done.
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.
List notes, optionally filtered by contact or deal.
| Parameter | Description |
|---|---|
contactIduuidoptional | Filter notes for a specific contact |
dealIdstringoptional | Filter notes for a specific deal |
{
"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 }
}Create a note on a contact or deal.
| Field | Description |
|---|---|
contentstringrequired | Note content (supports markdown) |
contactIduuidoptional | Attach to a contact |
dealIdstringoptional | Attach to a deal |
Retrieve a single note by ID.
Update note content.
Tags
Manage tags for segmenting and organizing contacts.
List all tags in the workspace with contact counts.
{
"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 }
}Create a new tag.
| Field | Description |
|---|---|
namestringrequired | Tag name (unique per workspace) |
colorstringoptional | Hex color code for display |
Retrieve a single tag with its contact count.
Update tag name or color.
Messages
Send SMS and email messages to contacts. View message history and delivery status.
List messages with optional filters for contact, channel, and direction.
| Parameter | Description |
|---|---|
contactIduuidoptional | Filter by contact |
channelstringoptional | Filter: sms, email |
directionstringoptional | Filter: inbound, outbound |
{
"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 }
}Send a message to a contact via SMS or email.
| Field | Description |
|---|---|
contactIduuidrequired | Recipient contact ID |
channelstringrequired | Channel: sms or email |
bodystringrequired | Message body (plain text for SMS, HTML for email) |
subjectstringoptional | Email subject (required for email channel) |
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.
List all conversation threads with latest message preview.
{
"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 the full conversation thread for a specific contact, with all messages across channels.
Calendars
Manage calendars and appointments. Create booking links, schedule meetings, and track availability.
List all calendars in the workspace.
Create a new calendar with availability settings.
| Field | Description |
|---|---|
namestringrequired | Calendar name |
timezonestringrequired | IANA timezone (e.g., America/New_York) |
slotDurationintegeroptional | Appointment duration in minutes (default: 30) |
availabilityobjectoptional | Weekly availability windows |
Retrieve calendar details and availability settings.
Update calendar settings.
List appointments for a calendar with optional date range filter.
| Parameter | Description |
|---|---|
startISO 8601optional | Start of date range |
endISO 8601optional | End of date range |
statusstringoptional | Filter: scheduled, completed, cancelled |
{
"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 }
}Schedule a new appointment on a calendar.
| Field | Description |
|---|---|
titlestringrequired | Appointment title |
startTimeISO 8601required | Start date and time |
endTimeISO 8601required | End date and time |
contactIduuidoptional | Link to a contact |
notesstringoptional | Appointment notes |
Custom Fields
Define custom fields for contacts, deals, and companies. Fields support text, number, date, select, and multi-select types.
List all custom field definitions.
| Parameter | Description |
|---|---|
entitystringoptional | Filter by entity type: contact, deal, company |
{
"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"]
}
]
}Define a new custom field.
| Field | Description |
|---|---|
namestringrequired | Display name |
keystringrequired | API key (snake_case, unique per entity) |
typestringrequired | Type: text, number, date, select, multi_select, boolean |
entitystringrequired | Entity type: contact, deal, company |
requiredbooleanoptional | Whether the field is required (default: false) |
optionsstring[]optional | Options for select/multi_select fields |
Update a custom field definition. Changing type is not allowed if data exists.
Delete a custom field definition. All values for this field across entities are permanently removed.
Webhooks
Register webhook endpoints to receive real-time event notifications. Webhooks are signed with HMAC-SHA256.
List all registered webhook endpoints.
{
"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
}
]
}Register a new webhook endpoint.
| Field | Description |
|---|---|
urlstringrequired | HTTPS endpoint URL |
eventsstring[]required | Array of event names to subscribe to |
activebooleanoptional | Whether the webhook is active (default: true) |
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"]
}'Retrieve webhook details including delivery history.
Update webhook URL, events, or active status.
Delete a webhook registration. No further events will be delivered.
Send a test payload to the webhook URL to verify it is receiving and processing events correctly.
{
"success": true,
"statusCode": 200,
"responseTime": 142,
"event": "test.ping"
}Users
Manage team members in the workspace. Invite new users, assign roles, and remove access.
List all users in the workspace.
{
"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 }
}Send an invitation email to add a new user to the workspace.
| Field | Description |
|---|---|
emailstringrequired | Email address to invite |
rolestringrequired | Role: admin, member, viewer |
namestringoptional | Display name for the invitation |
Retrieve a single user by ID.
Update a user's role or name. Requires admin scope.
Remove a user from the workspace. Their assigned contacts and deals are unassigned.
Automations
Manage n8n-powered automations. Register webhook triggers and fire custom events into your workflows.
List all automation configurations.
{
"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
}
]
}Create a new automation with a webhook trigger.
| Field | Description |
|---|---|
namestringrequired | Automation name |
triggerstringrequired | Event that triggers this automation |
webhookUrlstringrequired | n8n webhook URL to call |
activebooleanoptional | Whether the automation is active (default: true) |
Retrieve automation details and run history.
Fire a custom event to trigger any automations listening for it.
| Field | Description |
|---|---|
eventstringrequired | Custom event name (e.g., "custom.lead_scored") |
payloadobjectoptional | Arbitrary JSON payload passed to the automation |
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.
Batch update fields across multiple contacts.
| Field | Description |
|---|---|
idsuuid[]required | Array of contact IDs (max 1,000) |
updatesobjectrequired | Fields to update (applied to all contacts) |
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" }
}'{
"jobId": "job_01HXF8G9H",
"status": "processing",
"total": 3,
"processed": 0,
"errors": 0
}Batch delete multiple contacts. This is irreversible.
| Field | Description |
|---|---|
idsuuid[]required | Array of contact IDs to delete (max 1,000) |
Apply tags to multiple contacts at once.
| Field | Description |
|---|---|
idsuuid[]required | Array of contact IDs (max 1,000) |
tagsstring[]required | Tags to apply |
Batch update fields across multiple deals.
| Field | Description |
|---|---|
idsstring[]required | Array of deal IDs (max 1,000) |
updatesobjectrequired | Fields to update |
Search
Cross-entity search across contacts, deals, companies, and notes with a single query.
Search across all entities. Results are ranked by relevance and grouped by type.
| Parameter | Description |
|---|---|
qstringrequired | Search query (min 2 characters) |
typesstringoptional | Comma-separated entity types: contacts, deals, companies, notes |
limitintegeroptional | Max results per type (default: 10) |
curl -H "Authorization: Bearer cdy_your_api_key" \ "https://conduyt.app/api/v1/search?q=acme&types=contacts,deals&limit=5"
{
"results": {
"contacts": [
{ "id": "550e8400-...", "name": "Sarah Kim", "company": "Acme Corp", "score": 0.95 }
],
"deals": [
{ "id": "deal_01HX7Q5CA", "name": "Acme Renewal", "value": 24000, "score": 0.88 }
]
},
"totalResults": 6,
"queryTime": 12
}Activities
Audit trail of all actions in the workspace. Every create, update, delete, and login is logged.
List activity entries with optional filters. Ordered by timestamp descending.
| Parameter | Description |
|---|---|
entityTypestringoptional | Filter: contact, deal, task, note, pipeline, user |
entityIdstringoptional | Filter by specific entity ID |
actionstringoptional | Filter: created, updated, deleted, login |
userIduuidoptional | Filter by user who performed the action |
{
"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.
Create a Stripe checkout session for subscribing to a plan.
| Field | Description |
|---|---|
planstringrequired | Plan ID: starter, standard, premium, enterprise |
intervalstringoptional | Billing interval: monthly, annual (default: monthly) |
successUrlstringrequired | Redirect URL after successful checkout |
cancelUrlstringrequired | Redirect URL if checkout is cancelled |
{
"checkoutUrl": "https://checkout.stripe.com/c/pay/cs_live_...",
"sessionId": "cs_live_..."
}Generate a Stripe Customer Portal URL for managing the subscription, payment methods, and invoices.
{
"portalUrl": "https://billing.stripe.com/p/session/..."
}Get the current subscription status, plan, and usage for the workspace.
{
"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.
Retrieve dashboard statistics including contact counts, deal pipeline value, task status, and activity summary.
| Parameter | Description |
|---|---|
periodstringoptional | Time period: 7d, 30d, 90d, ytd (default: 30d) |
{
"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.
Authenticate with email and password. Returns a session token.
| Field | Description |
|---|---|
emailstringrequired | User email address |
passwordstringrequired | User password |
{
"token": "eyJhbGciOi...",
"user": {
"id": "usr_8f14e45f",
"name": "David Park",
"email": "dp@conduyt.app",
"role": "admin"
}
}Create a new account and workspace.
| Field | Description |
|---|---|
namestringrequired | Full name |
emailstringrequired | Email address |
passwordstringrequired | Password (min 8 characters) |
workspaceNamestringrequired | Workspace name |
Invalidate the current session token.
Get the current authenticated user and workspace details.
{
"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.
List all forms in the workspace with submission counts.
| Parameter | Description |
|---|---|
pageintegeroptional | Page number (default: 1) |
limitintegeroptional | Items per page (default: 50, max: 100) |
searchstringoptional | Search by form name |
{
"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 }
}curl -H "Authorization: Bearer cdy_your_api_key" \ "https://conduyt.app/api/v1/forms"
Create a new lead capture form with custom fields and settings.
| Field | Description |
|---|---|
namestringrequired | Form name (internal label) |
descriptionstringoptional | Description of the form's purpose |
fieldsarrayrequired | Array of field definitions. Each field: key, label, type (text, email, phone, textarea, select, number), required (boolean), options (for select type) |
settingsobjectoptional | Form settings: redirectUrl, notifyEmails (string[]), autoTag (tag name to apply), assignTo (user ID) |
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"
}
}'Retrieve a single form by ID, including its field definitions and submission count.
curl -H "Authorization: Bearer cdy_your_api_key" \ https://conduyt.app/api/v1/forms/frm_a1b2c3d4-e5f6-7890-abcd-ef1234567890
Update a form. Only include fields you want to change.
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 a form and all its submissions. This action cannot be undone.
curl -X DELETE -H "Authorization: Bearer cdy_your_api_key" \ https://conduyt.app/api/v1/forms/frm_a1b2c3d4-e5f6-7890-abcd-ef1234567890
List all submissions for a form, paginated. Each submission includes the submitted data and the auto-created contact reference.
| Parameter | Description |
|---|---|
pageintegeroptional | Page number (default: 1) |
limitintegeroptional | Items per page (default: 50, max: 100) |
{
"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 }
}curl -H "Authorization: Bearer cdy_your_api_key" \ "https://conduyt.app/api/v1/forms/frm_a1b2c3d4.../submissions?limit=25"
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.
| Field | Description |
|---|---|
dataobjectrequired | Key-value pairs matching the form's field keys. Required fields must be present. |
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"
}
}'{
"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.
List all products with optional search and active/inactive filtering.
| Parameter | Description |
|---|---|
pageintegeroptional | Page number (default: 1) |
limitintegeroptional | Items per page (default: 50, max: 100) |
searchstringoptional | Search by product name or SKU |
activebooleanoptional | Filter by active status (true/false) |
{
"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 }
}curl -H "Authorization: Bearer cdy_your_api_key" \ "https://conduyt.app/api/v1/products?active=true&search=CRM"
Create a new product in the catalog.
| Field | Description |
|---|---|
namestringrequired | Product name |
descriptionstringoptional | Product description |
pricenumberrequired | Unit price in dollars |
skustringoptional | Stock keeping unit identifier |
unitstringoptional | Unit of measure (e.g., hour, project, month, each) |
taxablebooleanoptional | Whether tax applies (default: true) |
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
}'Retrieve a single product by ID.
curl -H "Authorization: Bearer cdy_your_api_key" \ https://conduyt.app/api/v1/products/prod_7f8e9d0c-1b2a-3456-cdef-789012345678
Update a product. Only include fields you want to change.
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 a product. Products referenced in existing invoices will remain on those invoices but can no longer be used in new ones.
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.
List all invoices with optional filters for status, contact, and date range.
| Parameter | Description |
|---|---|
pageintegeroptional | Page number (default: 1) |
limitintegeroptional | Items per page (default: 50, max: 100) |
statusstringoptional | Filter by status: draft, sent, paid, overdue, void |
contactIduuidoptional | Filter by contact ID |
due_afterISO 8601optional | Invoices due after this date |
due_beforeISO 8601optional | Invoices due before this date |
{
"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 }
}curl -H "Authorization: Bearer cdy_your_api_key" \ "https://conduyt.app/api/v1/invoices?status=sent&due_before=2026-05-31"
Create a new invoice with line items. Totals are auto-calculated from item quantities and unit prices.
| Field | Description |
|---|---|
contactIduuidrequired | Contact to invoice |
itemsarrayrequired | Line items. Each: description (string), quantity (number), unitPrice (number), optional productId (uuid) |
taxRatenumberoptional | Tax rate as decimal (e.g., 0.0875 for 8.75%). Default: workspace setting. |
dueDateISO 8601optional | Payment due date. Default: 30 days from creation. |
notesstringoptional | Notes displayed on the invoice |
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."
}'{
"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"
}
}Retrieve a single invoice with all line items and payment history.
{
"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"
}
}curl -H "Authorization: Bearer cdy_your_api_key" \ https://conduyt.app/api/v1/invoices/inv_550e8400-e29b-41d4-a716-446655440000
Update a draft invoice. Sent and paid invoices cannot be edited. Void and recreate instead.
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" }'Mark an invoice as sent. Changes status from "draft" to "sent" and records the sent timestamp.
curl -X POST -H "Authorization: Bearer cdy_your_api_key" \ https://conduyt.app/api/v1/invoices/inv_550e8400.../send
{
"data": {
"id": "inv_550e8400-e29b-41d4-a716-446655440000",
"invoiceNumber": "INV-001",
"status": "sent",
"sentAt": "2026-04-19T10:30:00Z"
}
}Void an invoice. Voided invoices cannot be edited or paid. This action cannot be undone.
curl -X POST -H "Authorization: Bearer cdy_your_api_key" \ https://conduyt.app/api/v1/invoices/inv_550e8400.../void
List all payments recorded against an invoice.
{
"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"
}
]
}curl -H "Authorization: Bearer cdy_your_api_key" \ https://conduyt.app/api/v1/invoices/inv_550e8400.../payments
Record a payment against an invoice. Automatically updates the invoice's amountPaid and transitions status to "paid" when fully paid.
| Field | Description |
|---|---|
amountnumberrequired | Payment amount in dollars |
methodstringoptional | Payment method: credit_card, bank_transfer, check, cash, other |
referencestringoptional | External reference (check number, wire ref, etc.) |
notesstringoptional | Internal notes about this payment |
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"
}'{
"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}}.
List all email templates in the workspace.
| Parameter | Description |
|---|---|
pageintegeroptional | Page number (default: 1) |
limitintegeroptional | Items per page (default: 50, max: 100) |
searchstringoptional | Search by template name or subject |
{
"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 }
}curl -H "Authorization: Bearer cdy_your_api_key" \ "https://conduyt.app/api/v1/emails/templates?search=welcome"
Create a new email template with HTML content and merge fields.
| Field | Description |
|---|---|
namestringrequired | Internal template name |
subjectstringrequired | Email subject line (supports merge fields) |
bodyHtmlstringrequired | HTML email body (supports merge fields) |
bodyTextstringoptional | Plain text fallback. Auto-generated from HTML if omitted. |
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>"
}'Retrieve a single email template by ID.
curl -H "Authorization: Bearer cdy_your_api_key" \ https://conduyt.app/api/v1/emails/templates/tmpl_a1b2c3d4-5678-9012-abcd-ef3456789012
Update an email template. Only include fields you want to change.
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 an email template. Templates in use by active sequences cannot be deleted. Deactivate the sequence first.
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.
List all email sequences with enrollment stats.
{
"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 }
}curl -H "Authorization: Bearer cdy_your_api_key" \ "https://conduyt.app/api/v1/emails/sequences"
Create a new email sequence with ordered steps. Each step references a template and a delay (in days) from enrollment.
| Field | Description |
|---|---|
namestringrequired | Sequence name |
stepsarrayrequired | Ordered steps. Each: templateId (uuid), delayDays (integer, days after enrollment), optional subject override |
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" }
]
}'Retrieve a single sequence with its steps and enrollment statistics.
curl -H "Authorization: Bearer cdy_your_api_key" \ https://conduyt.app/api/v1/emails/sequences/seq_b2c3d4e5-f6a7-8901-bcde-f23456789012
Update a sequence. Modifying steps on an active sequence only affects future enrollments. Contacts already in progress continue on the original steps.
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" }'Enroll one or more contacts into a sequence. Contacts already enrolled are silently skipped.
| Field | Description |
|---|---|
contactIdsuuid[]required | Array of contact IDs to enroll (max 100 per request) |
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"] }'{
"enrolled": 2,
"skipped": 1,
"details": [
{ "contactId": "con_8f14e45f", "status": "enrolled" },
{ "contactId": "con_9a25f56g", "status": "enrolled" },
{ "contactId": "con_0b36g67h", "status": "skipped", "reason": "already_enrolled" }
]
}Remove a contact from a sequence. Stops all future emails in the sequence for this contact.
| Field | Description |
|---|---|
contactIduuidrequired | Contact ID to unenroll |
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" }'List all enrollments for a sequence, including current step and completion status.
| Parameter | Description |
|---|---|
statusstringoptional | Filter by enrollment status: active, completed, unenrolled |
pageintegeroptional | Page number (default: 1) |
limitintegeroptional | Items per page (default: 50, max: 100) |
{
"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 }
}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.
List all logged calls with optional filters.
| Parameter | Description |
|---|---|
pageintegeroptional | Page number (default: 1) |
limitintegeroptional | Items per page (default: 50, max: 100) |
contactIduuidoptional | Filter by contact ID |
userIduuidoptional | Filter by user who made/received the call |
directionstringoptional | Filter by direction: inbound, outbound |
statusstringoptional | Filter by status: completed, missed, voicemail, no_answer |
afterISO 8601optional | Calls after this date |
beforeISO 8601optional | Calls before this date |
{
"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 }
}curl -H "Authorization: Bearer cdy_your_api_key" \ "https://conduyt.app/api/v1/calls?direction=outbound&status=completed&after=2026-04-01"
Log a new call. Creates an entry in the contact's activity timeline.
| Field | Description |
|---|---|
contactIduuidrequired | Contact the call is with |
directionstringrequired | Call direction: inbound or outbound |
statusstringrequired | Call outcome: completed, missed, voicemail, no_answer |
durationintegeroptional | Call duration in seconds |
notesstringoptional | Call notes or summary |
startedAtISO 8601optional | When the call started (defaults to now) |
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"
}'Retrieve a single call log entry by ID.
curl -H "Authorization: Bearer cdy_your_api_key" \ https://conduyt.app/api/v1/calls/call_d4e5f6a7-b8c9-0123-def4-567890123456
Update a call log entry. Commonly used to add notes after a call or correct the status.
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.
List all workflows in the workspace.
| Parameter | Description |
|---|---|
pageintegeroptional | Page number (default: 1) |
limitintegeroptional | Items per page (default: 50, max: 100) |
statusstringoptional | Filter by status: active, inactive |
{
"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 }
}curl -H "Authorization: Bearer cdy_your_api_key" \ "https://conduyt.app/api/v1/workflows?status=active"
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.
| Field | Description |
|---|---|
namestringrequired | Workflow name |
descriptionstringoptional | Description of what this workflow does |
triggerobjectrequired | Trigger definition: event (string — e.g., contact.created, deal.stage_changed, form.submitted), optional conditions (object) |
actionsarrayrequired | Ordered actions. Each: type (assign_contact, send_email, create_task, update_field, send_webhook, enroll_sequence), config (object) |
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" } }
]
}'Retrieve a single workflow with its trigger, actions, and run statistics.
curl -H "Authorization: Bearer cdy_your_api_key" \ https://conduyt.app/api/v1/workflows/wf_e5f6a7b8-c9d0-1234-ef56-789012345678
Update a workflow. Active workflows can be updated. Changes take effect on the next trigger event.
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 a workflow. Active workflows must be deactivated before deletion.
curl -X DELETE -H "Authorization: Bearer cdy_your_api_key" \ https://conduyt.app/api/v1/workflows/wf_e5f6a7b8-c9d0-1234-ef56-789012345678
Activate a workflow. Once active, the workflow will fire on matching trigger events.
curl -X POST -H "Authorization: Bearer cdy_your_api_key" \ https://conduyt.app/api/v1/workflows/wf_e5f6a7b8.../activate
{
"data": {
"id": "wf_e5f6a7b8-c9d0-1234-ef56-789012345678",
"name": "Deal Won — Full Onboarding Flow",
"status": "active",
"activatedAt": "2026-04-19T12:00:00Z"
}
}Deactivate a workflow. Stops it from firing on new events. In-flight runs continue to completion.
curl -X POST -H "Authorization: Bearer cdy_your_api_key" \ https://conduyt.app/api/v1/workflows/wf_e5f6a7b8.../deactivate
List execution history for a workflow. Each run represents one trigger event and the resulting action executions.
| Parameter | Description |
|---|---|
pageintegeroptional | Page number (default: 1) |
limitintegeroptional | Items per page (default: 50, max: 100) |
statusstringoptional | Filter by run status: success, failed, running |
{
"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 }
}curl -H "Authorization: Bearer cdy_your_api_key" \ "https://conduyt.app/api/v1/workflows/wf_e5f6a7b8.../runs?status=failed&limit=10"
Get full details of a specific workflow run, including per-action results and any error messages.
{
"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
}
}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.