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

Build on Conduyt.
Ship faster.

Guides, API references, and SDKs for integrating with Conduyt CRM. Written by the engineers who built it.

Overview

Conduyt's API lets you programmatically manage contacts, deals, pipelines, tasks, and more. Build integrations, automate workflows, and extend your CRM with a REST API that mirrors every action available in the Conduyt web app.

The API uses standard HTTP verbs, returns JSON responses, and authenticates via Bearer tokens. If you can make HTTP requests, you can use Conduyt's API. No SDK required (though we publish official ones for Node.js and Python).

New: Browse all 200+ endpoints interactively in the API Explorer, or download the OpenAPI 3.1 spec to generate client SDKs in any language.

Authentication

All API requests require a Bearer token sent in the Authorization header. Tokens are scoped to a workspace and can be granted read-only, read-write, or admin permissions.

Creating an API Key

  1. Navigate to Settings → API in your Conduyt workspace
  2. Click Generate Key
  3. Choose a scope: read, read-write, or admin
  4. Copy the key immediately; it will only be shown once

All API keys are prefixed with cdy_ for easy identification in logs and config files. Workspace API keys do not expire. User-scoped tokens expire after 90 days of inactivity.

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

# 200 OK
Security tip: Store your API key in an environment variable (CONDUYT_API_KEY). Never commit keys to version control or expose them in client-side code.

Base URL

All API requests are made to the following base URL:

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

All endpoints documented in this guide are relative to this base. For example, the contacts list endpoint is GET https://conduyt.app/api/v1/contacts.

Rate Limits

Rate limits are enforced per API key and vary by plan tier. When you exceed the limit, the API returns 429 Too Many Requests with a Retry-After header indicating when you can retry.

PlanRate LimitBurst
Starter100 req/min20 req/sec
Standard500 req/min50 req/sec
Premium2,500 req/min100 req/sec
EnterpriseCustomCustom

Rate limit information is included in every response via these headers:

HeaderDescription
X-RateLimit-LimitMaximum requests allowed in the current window
X-RateLimit-RemainingRequests remaining in the current window
X-RateLimit-ResetUnix timestamp when the current window resets
Retry-AfterSeconds to wait before retrying (only on 429)

Accounts & Workspaces

Conduyt uses a multi-tenant architecture where all data is scoped to a workspace. Each workspace belongs to an account and is fully isolated: contacts, deals, pipelines, and settings in one workspace are invisible to another.

API keys are workspace-scoped. A single account can have multiple workspaces (e.g., one per department or region), each with its own API keys, pipelines, and team members.

Pagination

All list endpoints return paginated results. Conduyt uses page-based pagination with page and limit query parameters.

Paginated Request
GET /api/v1/contacts?page=2&limit=25

# Response includes pagination metadata
{
  "data": [...],
  "meta": {
    "page": 2,
    "limit": 25,
    "total": 342,
    "totalPages": 14
  }
}
ParameterTypeDefaultDescription
pageinteger1Page number to retrieve
limitinteger50Items per page (max: 100)

Filtering

Most list endpoints support filtering via query parameters. Filters are specific to each resource. See the API Reference for available filters per endpoint.

Common filter patterns:

  • Exact match: ?status=active
  • Search: ?search=sarah (searches across name, email, phone)
  • Date range: ?created_after=2026-01-01&created_before=2026-03-31
  • Relationship: ?assigned_to=uuid

Error Handling

All error responses follow a consistent JSON structure with a stable code enum, a human-readable message, and optional details 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"
      }
    ]
  }
}
HTTP StatusCodeMeaning
400invalid_requestMalformed request body or query parameters
401unauthenticatedMissing, invalid, or expired API key
403permission_deniedAPI key lacks the required scope for this action
404not_foundResource does not exist or is not accessible
422validation_failedRequest is well-formed but semantically invalid. Check details array.
429rate_limitedRate limit exceeded. Check Retry-After header.
500internal_errorSomething went wrong on our end. Retry after a moment.
503unavailableService temporarily unavailable. Check status page.

Webhooks

Webhooks let you receive real-time HTTP notifications when events occur in your workspace. Instead of polling the API, register a webhook URL and Conduyt will POST event payloads to it.

Signing & Verification

Every webhook request is signed with HMAC-SHA256 using your workspace's webhook secret. The signature is sent in the X-Conduyt-Signature header. Always verify signatures before processing webhooks.

Signature Verification · Node.js
import crypto from 'crypto';

function verifyWebhook(req, secret) {
  const signature = req.headers['x-conduyt-signature'];
  const computed = crypto
    .createHmac('sha256', secret)
    .update(JSON.stringify(req.body))
    .digest('hex');

  return crypto.timingSafeEqual(
    Buffer.from(signature),
    Buffer.from(computed)
  );
}

Retry Policy

If your endpoint returns a non-2xx status code, Conduyt retries with exponential backoff for up to 72 hours. After 72 hours of failures, the webhook is automatically disabled and you'll receive an email notification.

Available Events

  • contact.created, contact.updated, contact.deleted
  • deal.created, deal.updated, deal.stage_changed
  • task.created, task.completed
  • message.sent, message.received
  • note.created
  • pipeline.updated

See Webhooks API Reference for the full event catalog and payload schemas.

API Resources

Below is a summary of every resource available in the Conduyt API. Each links to its full endpoint documentation in the API Reference.

CRUD + IMPORT

Contacts

Create, read, update, delete contacts. Tag contacts, import from CSV, and perform bulk operations.

CRUD

Companies

Manage companies and link them to contacts. Track company-level data and relationships.

CRUD

Deals

Create and manage deals. Move deals through pipeline stages, assign owners, and track values.

CRUD

Pipelines

Configure pipelines and stages. Define stage order, probabilities, and multi-pipeline workflows.

CRUD

Tasks

Create tasks, assign to team members, set due dates, and mark complete. Link to contacts or deals.

CRUD

Notes

Add notes to contacts and deals. Rich text supported. Notes appear in the activity timeline.

CRUD

Tags

Create and manage tags. Apply tags to contacts for segmentation and filtering.

SEND + LIST

Messages

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

READ

Conversations

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

CRUD + TRIGGER

Automations

Register n8n webhook triggers, list automations, and fire custom events into your workflows.

CRUD

Calendars

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

CRUD

Custom Fields

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

CRUD + TEST

Webhooks

Register webhook endpoints, choose events to subscribe to, and send test payloads for verification.

CRUD + INVITE

Users

List team members, send invitations, update roles, and remove users from the workspace.

MANAGE

Billing

Create checkout sessions, access the billing portal, and check subscription status.

SEARCH

Search

Cross-entity search across contacts, deals, companies, and notes with a single query.

AUDIT

Activities

View the audit trail of all actions taken in the workspace. Filter by entity, user, or action type.

BATCH

Bulk Operations

Batch update, delete, or tag contacts and deals. Process up to 1,000 records per request.

CRUD + PUBLIC

Forms

Lead capture forms and submission tracking. Public submission endpoint auto-creates contacts by email.

CRUD

Products

Product catalog for invoicing. Manage SKUs, pricing, tax settings, and units.

CRUD + PAYMENTS

Invoices

Create, send, and track invoices with line items. Record payments and auto-calculate totals.

MANAGE

Payments

Record and manage payments against invoices. Auto-updates paid amounts and invoice status.

CRUD

Email Templates

Create and manage reusable email templates with merge fields for personalized outreach.

CRUD + ENROLL

Email Sequences

Automated multi-step email sequences. Enroll contacts, track opens, and manage drip campaigns.

CRUD

Calls

Log and track calls with contacts. Filter by direction, status, user, and date range.

CRUD + TRIGGER

Workflows

Advanced workflow automation with triggers, actions, and run history. Activate, deactivate, and monitor executions.

SDKs

Official SDKs wrap the REST API with typed methods, automatic pagination, and built-in retry logic. Any language with HTTP support works. The SDKs are a convenience, not a requirement.

Node.js / TypeScript

npm install @conduyt/sdk
Usage
import { Conduyt } from '@conduyt/sdk';

const client = new Conduyt({
  apiKey: process.env.CONDUYT_API_KEY,
});

// List contacts
const { data, meta } = await client.contacts.list({
  search: 'sarah',
  limit: 25,
});

// Create a deal
const deal = await client.deals.create({
  name: 'Acme Corp Renewal',
  value: 24000,
  pipelineId: 'pipe_abc123',
  stageId: 'stage_qualified',
});

// => "deal_01HX7Q5CA..."

Python

pip install conduyt
Usage
from conduyt import Conduyt

client = Conduyt(api_key=os.environ["CONDUYT_API_KEY"])

# List contacts
contacts = client.contacts.list(search="sarah", limit=25)

# Create a deal
deal = client.deals.create(
    name="Acme Corp Renewal",
    value=24000,
    pipeline_id="pipe_abc123",
    stage_id="stage_qualified",
)

print(deal.id)
# => "deal_01HX7Q5CA..."

Both SDKs are open source. Contributions welcome.

Quickstart

Go from zero to your first API call in under 5 minutes.

  1. Create an API key

    Go to Settings → API in your Conduyt workspace. Click Generate Key, select read-write scope, and copy the key. It starts with cdy_.

  2. List your contacts

    Make your first API call to fetch contacts from your workspace.

    curl
    curl -s https://conduyt.app/api/v1/contacts?limit=5 \
      -H "Authorization: Bearer cdy_your_api_key" | jq .
    
    # Returns your first 5 contacts with pagination metadata
  3. Create a deal

    Create a new deal in your default pipeline.

    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_default",
        "stageId": "stage_qualified"
      }'
    
    # Returns the newly created deal object
  4. Set up a webhook

    Subscribe to deal events so you get notified when deals are created or updated.

    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": ["deal.created", "deal.stage_changed"],
        "active": true
      }'
    
    # Returns the webhook object with your signing secret
  5. Next steps

    You're up and running. Explore the full API Reference for all available endpoints, or install an SDK for typed access in your language of choice.

Ready to integrate?

The API Reference documents every endpoint with parameters, response schemas, and curl examples.