Every API here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for apis
7 MCP tools reach this
find_apisBrowse and filter every API in the catalog.
get_api_artifactsOne API's artifacts, grouped by type.
get_openapiThe primary OpenAPI for this API.
find_similar_apisAPIs that look like this one.
apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
resolveTurn a domain, URL or GitHub org into the provider it belongs to.
find_cohortsEvery scored population of providers in the catalog.
All 92 tools →
Call it yourself
curl for this page
This API
curl "https://apis.io/api/v1/apis/conduyt-com:conduyt-com-email-sequences-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we
store it to create your key and to recognise you if you sign in with another
provider. See our Privacy Policy and
Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Conduyt Email Sequences 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: Email Sequences
description: Multi-step email sequences with enrollment
paths:
/emails/sequences:
get:
operationId: listEmailSequences
summary: List email sequences
tags:
- Email Sequences
parameters:
- name: archived
in: query
required: false
description: true lists archived sequences only (they are left out otherwise).
schema:
type: boolean
- name: is_active
in: query
required: false
description: Pass true or false to list only sequences that are On, or Off.
schema:
type: string
- name: page
in: query
required: false
description: Page number
schema:
type: integer
default: 1
minimum: 1
x-default-provenance: handler_literal
- name: per_page
in: query
required: false
description: Items per page (max 200)
schema:
type: integer
default: 50
minimum: 1
maximum: 200
x-default-provenance: handler_literal
- name: type
in: query
required: false
description: Only sequences of this channel.
schema:
type: string
enum:
- email
- sms
- name: view
in: query
required: false
description: Query parameter read by this route.
schema:
type: string
responses:
'200':
description: Paginated sequences
content:
application/json:
schema:
type: object
properties:
data:
type: object
properties:
data: {}
meta: {}
required:
- data
- meta
required:
- data
post:
operationId: createEmailSequence
summary: Create a sequence (email or SMS)
description: 'One model for Email and SMS sequences. Steps send saved templates (Email Templates or SMS Templates of the
sequence''s type) a number of days apart inside the send window; nothing is written inline. `type` is fixed at
creation. Runs stop on a reply, a booked meeting, an opt-out (STOP for SMS), a closed deal (when
`autoUnenrollOnDealClosed`), or a removal; see `GET /emails/sequences/{id}/enrollments` for how each run ended.'
tags:
- Email Sequences
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- name
- steps
properties:
name:
type: string
description:
type: string
type:
type: string
enum:
- email
- sms
default: email
description: The channel. Immutable after creation.
isActive:
type: boolean
default: false
description: On or Off. Off keeps every run where it is; the steps resume when turned On.
steps:
type: array
minItems: 1
description: In order. Every step names a template of the sequence's type; the first step's wait is 0.
items:
type: object
required:
- templateId
properties:
templateId:
type: string
format: uuid
description: An active template of the sequence's channel.
waitDays:
type: integer
minimum: 0
description: Days after the previous step.
body:
description: Read by the handler from the JSON body (the route declares no schema for its type).
bodyHtml:
description: Read by the handler from the JSON body (the route declares no schema for its type).
condition:
description: Read by the handler from the JSON body (the route declares no schema for its type).
delay:
description: Read by the handler from the JSON body (the route declares no schema for its type).
subject:
description: Read by the handler from the JSON body (the route declares no schema for its type).
templateName:
description: Read by the handler from the JSON body (the route declares no schema for its type).
senderUserId:
type:
- string
- 'null'
format: uuid
description: The team member the messages are from (must be an active member). Email sends from their on-domain address, SMS from their assigned line; null = the workspace default.
autoUnenrollOnReply:
type: boolean
default: true
description: Stop the contact's run when they reply to any message of the sequence.
autoUnenrollOnMeeting:
type: boolean
default: true
description: Stop the run when a meeting is booked through any Conduyt calendar.
autoUnenrollOnUnsubscribe:
type: boolean
default: true
description: Stop the run when the contact opts out (unsubscribe, or STOP for SMS).
autoUnenrollOnBounce:
type: boolean
default: true
description: Email only. Stop the run on a hard bounce (a soft bounce waits and retries).
autoUnenrollOnDealClosed:
type: boolean
default: true
description: Stop the contact's run when any of their deals closes, won or lost (any stage of a closed kind, custom stages included).
allowAutomationEnroll:
type: boolean
default: true
description: Let the automation action enroll_in_sequence put contacts in.
allowReenroll:
type: boolean
default: false
description: Let a contact go through it again once their earlier run ENDED (replied, meeting booked, deal closed, removed, completed). A live or paused run is never restarted.
weekdaysOnly:
type: boolean
default: true
description: Send only Monday to Friday, in the contact's time zone (else the workspace's).
sendStartHour:
type: integer
minimum: 0
maximum: 23
default: 9
description: First hour of the send window (local).
sendEndHour:
type: integer
minimum: 1
maximum: 24
default: 17
description: End of the send window, exclusive (local). A step due outside the window waits for the next opening.
responses:
'201':
description: Sequence created
content:
application/json:
schema:
type: object
properties:
data:
type: object
properties:
steps: {}
required:
- steps
required:
- data
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
/emails/sequences/{id}:
get:
operationId: getEmailSequence
summary: Get an email sequence by ID
tags:
- Email Sequences
parameters:
- $ref: '#/components/parameters/IdParam'
responses:
'200':
description: Sequence details with steps
content:
application/json:
schema:
type: object
properties:
data:
type: object
properties:
steps: {}
enrollmentStats: {}
required:
- steps
- enrollmentStats
required:
- data
'404':
$ref: '#/components/responses/NotFound'
patch:
operationId: updateEmailSequence
summary: Update a sequence, turn it On or Off, or archive it
description: 'Any field but `type` (400 when sent). `archived: true` turns the sequence Off and hides it from lists
(`GET /emails/sequences?archived=true` shows archived ones); `archived: false` restores it. Changing
`senderUserId` requires an active member.'
tags:
- Email Sequences
parameters:
- $ref: '#/components/parameters/IdParam'
- 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:
name:
type: string
description:
type: string
isActive:
type: boolean
archived:
type: boolean
description: true = Off and hidden; false = restored.
steps:
type: array
items:
type: object
required:
- templateId
properties:
templateId:
type: string
format: uuid
waitDays:
type: integer
minimum: 0
senderUserId:
type:
- string
- 'null'
format: uuid
description: The team member the messages are from (must be an active member). Email sends from their on-domain address, SMS from their assigned line; null = the workspace default.
autoUnenrollOnReply:
type: boolean
default: true
description: Stop the contact's run when they reply to any message of the sequence.
autoUnenrollOnMeeting:
type: boolean
default: true
description: Stop the run when a meeting is booked through any Conduyt calendar.
autoUnenrollOnUnsubscribe:
type: boolean
default: true
description: Stop the run when the contact opts out (unsubscribe, or STOP for SMS).
autoUnenrollOnBounce:
type: boolean
default: true
description: Email only. Stop the run on a hard bounce (a soft bounce waits and retries).
autoUnenrollOnDealClosed:
type: boolean
default: true
description: Stop the contact's run when any of their deals closes, won or lost (any stage of a closed kind, custom stages included).
allowAutomationEnroll:
type: boolean
default: true
description: Let the automation action enroll_in_sequence put contacts in.
allowReenroll:
type: boolean
default: false
description: Let a contact go through it again once their earlier run ENDED (replied, meeting booked, deal closed, removed, completed). A live or paused run is never restarted.
weekdaysOnly:
type: boolean
default: true
description: Send only Monday to Friday, in the contact's time zone (else the workspace's).
sendStartHour:
type: integer
minimum: 0
maximum: 23
default: 9
description: First hour of the send window (local).
sendEndHour:
type: integer
minimum: 1
maximum: 24
default: 17
description: End of the send window, exclusive (local). A step due outside the window waits for the next opening.
responses:
'200':
description: Sequence updated
content:
application/json:
schema:
$ref: '#/components/schemas/DataEnvelope'
/emails/sequences/{id}/enroll:
post:
operationId: enrollInSequence
summary: Enroll contacts in a sequence
tags:
- Email Sequences
parameters:
- $ref: '#/components/parameters/IdParam'
- 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
required:
- contactIds
properties:
contactIds:
type: array
items:
type: string
format: uuid
responses:
'200':
description: Contacts enrolled
content:
application/json:
schema:
type: object
properties:
data:
type: object
properties:
enrolled:
type: number
skipped: {}
total: {}
skippedDetails: {}
duplicates: {}
required:
- total
required:
- data
'201':
description: Created
x-generated-status: true
content:
application/json:
schema:
type: object
properties:
data:
type: object
properties:
enrolled: {}
skipped: {}
duplicates: {}
total: {}
skippedDetails: {}
required:
- total
required:
- data
/emails/sequences/{id}/unenroll:
post:
operationId: unenrollFromSequence
summary: Unenroll contacts from a sequence
tags:
- Email Sequences
parameters:
- $ref: '#/components/parameters/IdParam'
- 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
required:
- contactId
properties:
contactId:
type: string
format: uuid
description: The contact to remove from the sequence (one contact per call).
responses:
'200':
description: Contact unenrolled
content:
application/json:
schema:
type: object
properties:
data:
type: object
properties:
contactId: {}
unenrolled: {}
currentStatus: {}
required:
- contactId
- unenrolled
- currentStatus
required:
- data
/emails/sequences/{id}/enrollments:
get:
operationId: listSequenceEnrollments
summary: List enrollments for a sequence
tags:
- Email Sequences
parameters:
- $ref: '#/components/parameters/IdParam'
- name: all_active
in: query
required: false
description: Query parameter read by this route.
schema:
type: string
- name: page
in: query
required: false
description: Page number
schema:
type: integer
default: 1
minimum: 1
x-default-provenance: handler_literal
- name: per_page
in: query
required: false
description: Items per page (max 200)
schema:
type: integer
default: 50
minimum: 1
maximum: 200
x-default-provenance: handler_literal
- name: status
in: query
required: false
description: Query parameter read by this route.
schema:
type: string
responses:
'200':
description: Paginated enrollments
content:
application/json:
schema:
type: object
properties:
data:
type: object
properties:
data: {}
meta: {}
required:
- data
- meta
required:
- data
/emails/sequences/{id}/stats:
get:
operationId: getSequenceStats
summary: Get sequence performance stats
tags:
- Email Sequences
parameters:
- $ref: '#/components/parameters/IdParam'
responses:
'200':
description: Sequence stats (enrolled, completed, open rate, click rate)
content:
application/json:
schema:
type: object
properties:
data:
type: object
properties:
data: {}
required:
- data
required:
- data
components:
schemas:
DataEnvelope:
type: object
properties:
data:
description: Response payload (shape varies by endpoint)
ErrorResponse:
type: object
required:
- error
properties:
error:
type: string
code:
type: string
description: Machine-readable error code (e.g., TRIAL_EXPIRED, PLAN_LIMIT_REACHED)
responses:
NotFound:
description: Resource not found
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
parameters:
IdParam:
name: id
in: path
required: true
schema:
type: string
format: uuid
description: Resource UUID
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