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-custom-fields-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 Custom Fields 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: Custom Fields
description: Custom field definitions for contacts and deals
paths:
/custom-fields:
get:
operationId: listCustomFields
summary: List custom field definitions
tags:
- Custom Fields
parameters:
- name: entityType
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: 1000
x-default-provenance: handler_literal
responses:
'200':
description: Custom field definitions
content:
application/json:
schema:
type: object
properties:
data:
type: array
items: {}
meta:
type: object
properties:
page:
type: integer
perPage:
type: integer
total:
type: integer
totalPages:
type: integer
required:
- page
- perPage
- total
- totalPages
required:
- data
- meta
post:
operationId: createCustomField
summary: Create a custom field definition
tags:
- Custom Fields
requestBody:
required: true
content:
application/json:
schema:
type: object
additionalProperties: false
required:
- entityType
- fieldKey
- label
- fieldType
properties:
entityType:
type: string
enum:
- contact
- deal
- company
fieldKey:
type: string
minLength: 1
pattern: ^[a-zA-Z_][a-zA-Z0-9_]*$
description: Machine-readable key (e.g., "industry_vertical") Must not name a member every JavaScript object inherits (constructor, toString, __proto__ ...), nor a reserved integration key (oes_number and closer on contacts; oes_number and dpp_oes_raw on deals except as a plain optional text field; the Phone Verification keys such as sms_carrier, a 409); otherwise a 400. Leading and trailing whitespace is trimmed before the length check, so a blank value is refused.
label:
type: string
minLength: 1
maxLength: 200
description: Human-readable label (e.g., "Industry Vertical") Leading and trailing whitespace is trimmed before the length check, so a blank value is refused.
section:
anyOf:
- type: string
maxLength: 120
- type: 'null'
fieldType:
type: string
enum:
- text
- textarea
- number
- date
- datetime
- url
- select
- radio
- multiselect
- boolean
- phone
- email
options:
anyOf:
- maxItems: 100
type: array
items:
type: string
minLength: 1
maxLength: 200
description: Leading and trailing whitespace is trimmed before the length check, so a blank value is refused.
- type: object
properties:
choices:
maxItems: 100
type: array
items:
type: string
minLength: 1
maxLength: 200
description: Leading and trailing whitespace is trimmed before the length check, so a blank value is refused.
options:
maxItems: 100
type: array
items:
type: string
minLength: 1
maxLength: 200
description: Leading and trailing whitespace is trimmed before the length check, so a blank value is refused.
numberFormat:
type: string
enum:
- plain
- formatted
- currency
- percentage
currencyCode:
type: string
pattern: ^[A-Z]{3}$
allowedDomains:
maxItems: 50
type: array
items:
type: string
minLength: 1
maxLength: 253
description: Leading and trailing whitespace is trimmed before the length check, so a blank value is refused.
blockedDomains:
maxItems: 50
type: array
items:
type: string
minLength: 1
maxLength: 253
description: Leading and trailing whitespace is trimmed before the length check, so a blank value is refused.
visibility:
type: object
properties:
fieldKey:
type: string
minLength: 1
maxLength: 120
description: Leading and trailing whitespace is trimmed before the length check, so a blank value is refused.
operator:
type: string
enum:
- equals
- not_empty
- empty
value:
type: string
maxLength: 200
required:
- fieldKey
- operator
additionalProperties: false
additionalProperties: false
- type: 'null'
description: Options for select/multiselect fields A select or multiselect field needs at least one option value; otherwise a 422.
isRequired:
type: boolean
sortOrder:
type: integer
minimum: 0
maximum: 100000
responses:
'201':
description: Custom field created
content:
application/json:
schema:
$ref: '#/components/schemas/DataEnvelope'
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
/custom-fields/{id}:
patch:
operationId: updateCustomField
summary: Update a custom field definition
tags:
- Custom Fields
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
additionalProperties: false
properties:
label:
type: string
minLength: 1
maxLength: 200
description: Human-readable label (e.g., "Industry Vertical") Leading and trailing whitespace is trimmed before the length check, so a blank value is refused.
section:
anyOf:
- type: string
maxLength: 120
- type: 'null'
options:
anyOf:
- maxItems: 100
type: array
items:
type: string
minLength: 1
maxLength: 200
description: Leading and trailing whitespace is trimmed before the length check, so a blank value is refused.
- type: object
properties:
choices:
maxItems: 100
type: array
items:
type: string
minLength: 1
maxLength: 200
description: Leading and trailing whitespace is trimmed before the length check, so a blank value is refused.
options:
maxItems: 100
type: array
items:
type: string
minLength: 1
maxLength: 200
description: Leading and trailing whitespace is trimmed before the length check, so a blank value is refused.
numberFormat:
type: string
enum:
- plain
- formatted
- currency
- percentage
currencyCode:
type: string
pattern: ^[A-Z]{3}$
allowedDomains:
maxItems: 50
type: array
items:
type: string
minLength: 1
maxLength: 253
description: Leading and trailing whitespace is trimmed before the length check, so a blank value is refused.
blockedDomains:
maxItems: 50
type: array
items:
type: string
minLength: 1
maxLength: 253
description: Leading and trailing whitespace is trimmed before the length check, so a blank value is refused.
visibility:
type: object
properties:
fieldKey:
type: string
minLength: 1
maxLength: 120
description: Leading and trailing whitespace is trimmed before the length check, so a blank value is refused.
operator:
type: string
enum:
- equals
- not_empty
- empty
value:
type: string
maxLength: 200
required:
- fieldKey
- operator
additionalProperties: false
additionalProperties: false
- type: 'null'
description: Options for select/multiselect fields
isRequired:
type: boolean
sortOrder:
type: integer
minimum: 0
maximum: 100000
confirmRequired:
type: boolean
responses:
'200':
description: Custom field updated
content:
application/json:
schema:
$ref: '#/components/schemas/DataEnvelope'
delete:
operationId: deleteCustomField
summary: Delete a custom field definition
tags:
- Custom Fields
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
responses:
'200':
description: Custom field deleted
content:
application/json:
schema:
type: object
properties:
data:
type: object
properties:
id: {}
deleted:
type: boolean
cleanupJobId: {}
cleanupAlreadyQueued:
type: boolean
contactTableDefaultsColumnRemoved: {}
contactTableDefaultsVersion: {}
contactTableDefaults: {}
valuesQueuedForCleanup: {}
dependencySummary: {}
required:
- id
- deleted
- cleanupJobId
- cleanupAlreadyQueued
- contactTableDefaultsColumnRemoved
- contactTableDefaultsVersion
- contactTableDefaults
- valuesQueuedForCleanup
- dependencySummary
required:
- data
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
confirmImpact:
description: Read by the handler from the JSON body (the route declares no schema for its type).
expectedDependencyCount:
description: Read by the handler from the JSON body (the route declares no schema for its type).
expectedValueCount:
description: Read by the handler from the JSON body (the route declares no schema for its type).
get:
x-generated: true
operationId: getCustomFieldsId
summary: Get custom-fields id
tags:
- Custom Fields
parameters:
- name: id
in: path
required: true
schema:
type: string
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/DataEnvelope'
/custom-fields/{id}/history:
get:
x-generated: true
operationId: getCustomFieldsIdHistory
summary: Get custom-fields id history
tags:
- Custom Fields
parameters:
- name: id
in: path
required: true
schema:
type: string
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/DataEnvelope'
/custom-fields/{id}/impact:
get:
x-generated: true
operationId: getCustomFieldsIdImpact
summary: Get custom-fields id impact
tags:
- Custom Fields
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:
field: {}
valueCount: {}
population: {}
dependencies: {}
dependencyCount: {}
required:
- field
- valueCount
- population
- dependencies
- dependencyCount
required:
- data
components:
schemas:
DataEnvelope:
type: object
properties:
data:
description: Response payload (shape varies by endpoint)
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