Every API here is available over the APIs.io API and to AI agents over MCP.
openapi: 3.2.0
info:
title: Conduyt Smart Views API
version: 1.0.0
description: 'The Conduyt CRM API provides programmatic access to your CRM data including
contacts, companies, deals, pipelines, tasks, notes, automations, invoices,
email sequences, and more.
## Authentication
All authenticated endpoints require a Bearer token (API key) in the
`Authorization` header:
```
Authorization: Bearer cdy_
```
API keys are generated in **Settings > API Keys** within the Conduyt
dashboard. Keys use the `cdy_` prefix and are hashed with bcrypt on
creation — the full key is shown exactly once at creation time.
Session cookie authentication (`conduyt_session`) is also supported for
browser-based clients but is not recommended for integrations.
## Rate Limiting
API keys enforce a per-key rate limit. New keys default to 100 requests per
minute and can be configured at creation time or with PATCH `/api-keys/{id}`.
Some public and provider-facing endpoints also enforce stricter per-IP or
per-account limits. When exceeded, the API returns `429 Too Many Requests`
with a `Retry-After` header indicating seconds until the next allowed
request.
| Endpoint Group | Limit |
|---------------------|---------------------|
| API keys | Default 100 / min per key |
| Login/reset | 5 / min per IP |
| Registration | 3 / hour per IP |
| Contact/Deal create | 30 / min per IP |
| Inbound messages | 120 / min per account/IP |
## Pagination
List endpoints support cursor-based pagination via query parameters:
- `page` — Page number (default: 1)
- `per_page` — Items per page (default: 50, max: 200)
- `limit` — Accepted as an alias of `per_page` on `GET /contacts`; if both are
sent they must carry the same value.
A page size above the maximum, a non-integer, a value below 1, or a
pagination key repeated with different values is rejected with `400`
(the message names the parameter and the rule); nothing is silently
clamped or ignored.
Responses include a `meta` object: `{ page, per_page, total }`.
An operation that documents its own pagination rules follows those instead.
`GET /sms-providers/options` pages with an opaque `cursor` and a `limit`
that is capped at 50 rather than rejected; its responses carry
`meta: { nextCursor, truncated }`.
## Response Format
All successful responses wrap data in a `data` envelope:
```json
{ "data": { ... } }
```
Error responses use:
```json
{ "error": "Human-readable error message" }
```
## Multi-Tenancy
Conduyt is multi-tenant. All data is scoped to the authenticated user''s
current account. API keys are bound to a specific account at creation time.
## Webhook Events
Outbound webhooks fire on events including:
`contact.created`, `contact.updated`, `contact.deleted`,
`deal.created`, `deal.updated`, `deal.won`, `deal.lost`,
`task.created`, `task.completed`, `note.created`,
`appointment.created`, `appointment.updated`,
`form.submitted`, `invoice.paid`
Payloads are signed with HMAC-SHA256 using the webhook''s secret. Retry
schedule: 1m, 5m, 30m, 2h, 12h, 72h (7 total attempts including the initial delivery).'
contact:
name: Conduyt Support
url: https://conduyt.app
email: support@conduyt.app
license:
name: Proprietary
url: https://conduyt.app/terms
servers:
- url: https://conduyt.app/api/v1
description: Production
security:
- BearerAuth: []
tags:
- name: Smart Views
paths:
/smart-views:
post:
x-generated: true
operationId: postSmartViews
summary: Create / invoke smart-views
tags:
- Smart Views
parameters:
- name: dry_run
in: query
required: false
description: Validate the mutation without persisting changes.
schema:
type: boolean
- name: sandbox
in: query
required: false
description: Run the mutation in sandbox mode.
schema:
type: boolean
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
icon:
type: string
enum:
- heart
- star
- trophy
- badge
- target
- eye
- clock
- hourglass
- siren
- bolt
- fire
- rain
- funnel
- pyramid
- flag
- pin
- push-pin
- thumbs-up
- thumbs-down
- coffee
- rocket
- number-1
- number-2
- number-3
- number-4
- number-5
- number-6
- number-7
- number-8
- number-9
- flame
- zap
- alert-circle
- circle-alert
- bell
- filter
- trending-up
- list
- phone
- phone-off
- users
- tags
- tag
- mail-x
- calendar
- sparkles
- bookmark
default: heart
x-enum-current:
- heart
- star
- trophy
- badge
- target
- eye
- clock
- hourglass
- siren
- bolt
- fire
- rain
- funnel
- pyramid
- flag
- pin
- push-pin
- thumbs-up
- thumbs-down
- coffee
- rocket
- number-1
- number-2
- number-3
- number-4
- number-5
- number-6
- number-7
- number-8
- number-9
x-enum-deprecated:
- flame
- zap
- alert-circle
- circle-alert
- bell
- filter
- trending-up
- list
- phone
- phone-off
- users
- tags
- tag
- mail-x
- calendar
- sparkles
- bookmark
description: 'The view''s icon: one of heart, star, trophy, badge, target, eye, clock, hourglass, siren, bolt, fire, rain, funnel, pyramid, flag, pin, push-pin, thumbs-up, thumbs-down, coffee, rocket, number-1, number-2, number-3, number-4, number-5, number-6, number-7, number-8, number-9 (picker order). Deprecated inputs, accepted and stored as their mapped id: flame, zap, alert-circle, circle-alert, bell, filter, trending-up, list, phone, phone-off, users, tags, tag, mail-x, calendar, sparkles, bookmark. Responses always carry a current id. Anything else, null included, is 400 with code invalid_icon (field: "icon", allowed: the current ids). Omitted: heart.'
description:
description: Read by the handler from the JSON body (the route declares no schema for its type).
dialCooldownMinutes:
description: Read by the handler from the JSON body (the route declares no schema for its type).
dialEnabled:
description: Read by the handler from the JSON body (the route declares no schema for its type).
dialIncludeUnassigned:
description: Read by the handler from the JSON body (the route declares no schema for its type).
dialPoolAssignOn:
description: Read by the handler from the JSON body (the route declares no schema for its type).
dialSchedule:
type: array
items:
type: object
properties:
attemptNumber:
description: Read by the handler from the JSON body (the route declares no schema for its type).
delayMinutes:
description: Read by the handler from the JSON body (the route declares no schema for its type).
description: Read by the handler from the JSON body (the route declares no schema for its type).
description: Read by the handler from the JSON body (the route declares no schema for its type).
filters:
type: array
items:
type: object
properties:
conjunction:
description: Read by the handler from the JSON body (the route declares no schema for its type).
field:
description: Read by the handler from the JSON body (the route declares no schema for its type).
operator:
description: Read by the handler from the JSON body (the route declares no schema for its type).
rules:
type: array
items:
type: object
properties:
field:
description: Read by the handler from the JSON body (the route declares no schema for its type).
operator:
description: Read by the handler from the JSON body (the route declares no schema for its type).
value:
description: Read by the handler from the JSON body (the route declares no schema for its type).
description: Read by the handler from the JSON body (the route declares no schema for its type).
description: Read by the handler from the JSON body (the route declares no schema for its type).
value:
description: Read by the handler from the JSON body (the route declares no schema for its type).
description: Read by the handler from the JSON body (the route declares no schema for its type).
description: Read by the handler from the JSON body (the route declares no schema for its type).
groupId:
description: Read by the handler from the JSON body (the route declares no schema for its type).
maxDialAttempts:
description: Read by the handler from the JSON body (the route declares no schema for its type).
maxDialAttemptsPerDay:
description: Read by the handler from the JSON body (the route declares no schema for its type).
members:
type: array
items:
type: object
properties:
userId:
description: Read by the handler from the JSON body (the route declares no schema for its type).
description: Read by the handler from the JSON body (the route declares no schema for its type).
description: Read by the handler from the JSON body (the route declares no schema for its type).
name:
description: Read by the handler from the JSON body (the route declares no schema for its type).
personal:
description: Read by the handler from the JSON body (the route declares no schema for its type).
sortField:
description: Read by the handler from the JSON body (the route declares no schema for its type).
sortOrder:
description: Read by the handler from the JSON body (the route declares no schema for its type).
responses:
'201':
description: Created
content:
application/json:
schema:
type: object
properties:
data:
type: object
properties:
icon: {}
dialSchedule: {}
required:
- icon
- dialSchedule
required:
- data
'400':
description: Invalid body. An icon outside the set answers code invalid_icon with field "icon" and allowed (the current ids).
content:
application/json:
schema:
type: object
properties:
error:
type: string
code:
type: string
field:
type: string
allowed:
type: array
items:
type: string
required:
- error
/smart-views/{id}:
delete:
x-generated: true
operationId: deleteSmartViewsId
summary: Delete smart-views id
tags:
- Smart Views
parameters:
- name: id
in: path
required: true
schema:
type: string
- name: dry_run
in: query
required: false
description: Validate the mutation without persisting changes.
schema:
type: boolean
- name: sandbox
in: query
required: false
description: Run the mutation in sandbox mode.
schema:
type: boolean
responses:
'200':
description: Success
content:
application/json:
schema:
type: object
properties:
data:
type: object
properties:
success:
type: boolean
required:
- success
required:
- data
patch:
x-generated: true
operationId: patchSmartViewsId
summary: Update smart-views id
tags:
- Smart Views
parameters:
- name: id
in: path
required: true
schema:
type: string
- name: dry_run
in: query
required: false
description: Validate the mutation without persisting changes.
schema:
type: boolean
- name: sandbox
in: query
required: false
description: Run the mutation in sandbox mode.
schema:
type: boolean
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
icon:
type: string
enum:
- heart
- star
- trophy
- badge
- target
- eye
- clock
- hourglass
- siren
- bolt
- fire
- rain
- funnel
- pyramid
- flag
- pin
- push-pin
- thumbs-up
- thumbs-down
- coffee
- rocket
- number-1
- number-2
- number-3
- number-4
- number-5
- number-6
- number-7
- number-8
- number-9
- flame
- zap
- alert-circle
- circle-alert
- bell
- filter
- trending-up
- list
- phone
- phone-off
- users
- tags
- tag
- mail-x
- calendar
- sparkles
- bookmark
x-enum-current:
- heart
- star
- trophy
- badge
- target
- eye
- clock
- hourglass
- siren
- bolt
- fire
- rain
- funnel
- pyramid
- flag
- pin
- push-pin
- thumbs-up
- thumbs-down
- coffee
- rocket
- number-1
- number-2
- number-3
- number-4
- number-5
- number-6
- number-7
- number-8
- number-9
x-enum-deprecated:
- flame
- zap
- alert-circle
- circle-alert
- bell
- filter
- trending-up
- list
- phone
- phone-off
- users
- tags
- tag
- mail-x
- calendar
- sparkles
- bookmark
description: 'The view''s icon: one of heart, star, trophy, badge, target, eye, clock, hourglass, siren, bolt, fire, rain, funnel, pyramid, flag, pin, push-pin, thumbs-up, thumbs-down, coffee, rocket, number-1, number-2, number-3, number-4, number-5, number-6, number-7, number-8, number-9 (picker order). Deprecated inputs, accepted and stored as their mapped id: flame, zap, alert-circle, circle-alert, bell, filter, trending-up, list, phone, phone-off, users, tags, tag, mail-x, calendar, sparkles, bookmark. Responses always carry a current id. Anything else, null included, is 400 with code invalid_icon (field: "icon", allowed: the current ids). Omitted: unchanged.'
description:
description: Read by the handler from the JSON body (the route declares no schema for its type).
dialCooldownMinutes:
description: Read by the handler from the JSON body (the route declares no schema for its type).
dialEnabled:
description: Read by the handler from the JSON body (the route declares no schema for its type).
dialIncludeUnassigned:
description: Read by the handler from the JSON body (the route declares no schema for its type).
dialPoolAssignOn:
description: Read by the handler from the JSON body (the route declares no schema for its type).
dialSchedule:
type: array
items:
type: object
properties:
attemptNumber:
description: Read by the handler from the JSON body (the route declares no schema for its type).
delayMinutes:
description: Read by the handler from the JSON body (the route declares no schema for its type).
description: Read by the handler from the JSON body (the route declares no schema for its type).
description: Read by the handler from the JSON body (the route declares no schema for its type).
filters:
type: array
items:
type: object
properties:
conjunction:
description: Read by the handler from the JSON body (the route declares no schema for its type).
field:
description: Read by the handler from the JSON body (the route declares no schema for its type).
operator:
description: Read by the handler from the JSON body (the route declares no schema for its type).
rules:
type: array
items:
type: object
properties:
field:
description: Read by the handler from the JSON body (the route declares no schema for its type).
operator:
description: Read by the handler from the JSON body (the route declares no schema for its type).
value:
description: Read by the handler from the JSON body (the route declares no schema for its type).
description: Read by the handler from the JSON body (the route declares no schema for its type).
description: Read by the handler from the JSON body (the route declares no schema for its type).
value:
description: Read by the handler from the JSON body (the route declares no schema for its type).
description: Read by the handler from the JSON body (the route declares no schema for its type).
description: Read by the handler from the JSON body (the route declares no schema for its type).
groupId:
description: Read by the handler from the JSON body (the route declares no schema for its type).
isEnabled:
description: Read by the handler from the JSON body (the route declares no schema for its type).
maxDialAttempts:
description: Read by the handler from the JSON body (the route declares no schema for its type).
maxDialAttemptsPerDay:
description: Read by the handler from the JSON body (the route declares no schema for its type).
members:
type: array
items:
type: object
properties:
userId:
description: Read by the handler from the JSON body (the route declares no schema for its type).
description: Read by the handler from the JSON body (the route declares no schema for its type).
description: Read by the handler from the JSON body (the route declares no schema for its type).
name:
description: Read by the handler from the JSON body (the route declares no schema for its type).
sortField:
description: Read by the handler from the JSON body (the route declares no schema for its type).
sortOrder:
description: Read by the handler from the JSON body (the route declares no schema for its type).
responses:
'200':
description: Success
content:
application/json:
schema:
type: object
properties:
data:
type: object
properties:
icon: {}
dialSchedule: {}
required:
- icon
- dialSchedule
required:
- data
'400':
description: Invalid body. An icon outside the set answers code invalid_icon with field "icon" and allowed (the current ids).
content:
application/json:
schema:
type: object
properties:
error:
type: string
code:
type: string
field:
type: string
allowed:
type: array
items:
type: string
required:
- error
get:
x-generated: true
operationId: getSmartViewsId
summary: Get smart-views id
tags:
- Smart Views
parameters:
- name: id
in: path
required: true
schema:
type: string
responses:
'200':
description: Success
content:
application/json:
schema:
type: object
properties:
data:
type: object
properties:
icon: {}
dialSchedule: {}
dialPoolAssignOn: {}
required:
- icon
- dialSchedule
- dialPoolAssignOn
required:
- data
/smart-views/reorder:
patch:
x-generated: true
operationId: patchSmartViewsReorder
summary: Update smart-views reorder
tags:
- Smart Views
parameters:
- name: dry_run
in: query
required: false
description: Validate the mutation without persisting changes.
schema:
type: boolean
- name: sandbox
in: query
required: false
description: Run the mutation in sandbox mode.
schema:
type: boolean
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
move:
type: object
properties:
afterId:
description: Read by the handler from the JSON body (the route declares no schema for its type).
beforeId:
description: Read by the handler from the JSON body (the route declares no schema for its type).
id:
description: Read by the handler from the JSON body (the route declares no schema for its type).
description: Read by the handler from the JSON body (the route declares no schema for its type).
order:
description: Read by the handler from the JSON body (the route declares no schema for its type).
responses:
'200':
description: Success
content:
application/json:
schema:
type: object
properties:
data:
type: object
properties:
success:
type: boolean
required:
- success
required:
- data
/smart-views/dial-order:
get:
x-generated: true
operationId: getSmartViewsDialOrder
summary: List smart-views dial-order
tags:
- Smart Views
responses:
'200':
description: Success
content:
application/json:
schema:
type: object
properties:
data:
type: object
properties:
priorities: {}
candidates: {}
total: {}
required:
- priorities
- candidates
- total
required:
- data
patch:
x-generated: true
operationId: patchSmartViewsDialOrder
summary: Update smart-views dial-order
tags:
- Smart Views
parameters:
- name: dry_run
in: query
required: false
description: Validate the mutation without persisting changes.
schema:
type: boolean
- name: sandbox
in: query
required: false
description: Run the mutation in sandbox mode.
schema:
type: boolean
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
order:
description: Read by the handler from the JSON body (the route declares no schema for its type).
responses:
'200':
description: Success
content:
application/json:
schema:
type: object
properties:
data:
type: object
properties:
success:
type: boolean
order: {}
priorities: {}
required:
- success
- order
- priorities
required:
- data
/smart-views/version:
get:
x-generated: true
operationId: getSmartViewsVersion
summary: List smart-views version
tags:
- Smart Views
responses:
'200':
description: Success
content:
application/json:
schema:
type: object
properties:
data:
type: object
properties:
order_stamp: {}
total: {}
required:
- order_stamp
- total
required:
- data
components:
securitySchemes:
BearerAuth:
type: http
scheme: bearer
description: 'API key authentication. Generate keys in Settings > API Keys.
Keys use the `cdy_` prefix.
Example: `Authorization: Bearer cdy_a1b2c3d4e5f6...`
'
x-mcp:
transport:
- stdio
- http
orchestration: code
endpoint_tools: hidden