API reference

Customers

Objects and fields, records, list views, search, pipelines, activities, imports and exports.

See Customers. Records are read and changed as the caller: what sharing and their role allow. Keys act as their maker, narrowed by the key's scopes.

GET /v1/orgs/:orgId/crm/objects

Every object with its fields, validation rules and indexes.

Auth: user access token or platform agent key · Scope: crm:read

Path parameterDescription
:orgIdOrganization id (org_…).

Response 200

{
  objects: {
    id: string
    label: string
    plural: string
    prefix: string
    glyph: string
    custom?: boolean
    nameFields: string[]
    fields: {
      id: string
      label: string
      type: "number" | "text" | "email" | "url" | "date" | "owner" | "pipeline" | "phone" | "textarea" | "checkbox" | "currency" | "stage" | "lookup" | "datetime" | "percent" | "picklist" | "multipicklist" | "lookups"
      required?: boolean
      custom?: boolean
      system?: boolean
      readOnly?: boolean
      searchable?: boolean
      help?: string
      maxLength?: number
      min?: number
      max?: number
      decimals?: number
      values?: {
        value: string
        label?: string
        inactive?: boolean
      }[]
      target?: string
      convertTo?: {
        object: "contact" | "account" | "opportunity"
        field: string
      }
    }[]
    rules: {
      id: string
      name: string
      active: boolean
      when: {
        field: string
        op: "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
        value?: unknown
      }[]
      require: {
        field: string
        op: "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
        value?: unknown
      }[]
      message: string
      field?: string
    }[]
    sharing: "private" | "read" | "readwrite"
    indexes: {
      id: string
      eq: string[]
      sort: string
      status: "building" | "ready"
      builtin?: boolean
      createdAt: number
    }[]
    indexShards: number
    listColumns: string[]
    subtitleFields: string[]
    version: number
    createdAt: number
    updatedAt: number
  }[]
}

Errors

StatusMessage
429Too many requests to Customers this minute. Try again shortly.

POST /v1/orgs/:orgId/crm/objects

A custom object (Customers admins): a name field, the system fields and the built-in indexes.

Auth: user access token or platform agent key · Scopes: crm:read, crm:admin

Path parameterDescription
:orgIdOrganization id (org_…).

Request body

FieldTypeRequiredDefaultNotes
labelstringYes1–60 characters; trimmed
pluralstringNo""up to 60 characters; trimmed
nameLabelstringNoup to 60 characters; trimmed
sharing"private" | "read" | "readwrite"No

Response 201

{
  object: {
    id: string
    label: string
    plural: string
    prefix: string
    glyph: string
    custom?: boolean
    nameFields: string[]
    fields: {
      id: string
      label: string
      type: "number" | "text" | "email" | "url" | "date" | "owner" | "pipeline" | "phone" | "textarea" | "checkbox" | "currency" | "stage" | "lookup" | "datetime" | "percent" | "picklist" | "multipicklist" | "lookups"
      required?: boolean
      custom?: boolean
      system?: boolean
      readOnly?: boolean
      searchable?: boolean
      help?: string
      maxLength?: number
      min?: number
      max?: number
      decimals?: number
      values?: {
        value: string
        label?: string
        inactive?: boolean
      }[]
      target?: string
      convertTo?: {
        object: "contact" | "account" | "opportunity"
        field: string
      }
    }[]
    rules: {
      id: string
      name: string
      active: boolean
      when: {
        field: string
        op: "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
        value?: unknown
      }[]
      require: {
        field: string
        op: "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
        value?: unknown
      }[]
      message: string
      field?: string
    }[]
    sharing: "private" | "read" | "readwrite"
    indexes: {
      id: string
      eq: string[]
      sort: string
      status: "building" | "ready"
      builtin?: boolean
      createdAt: number
    }[]
    indexShards: number
    listColumns: string[]
    subtitleFields: string[]
    version: number
    createdAt: number
    updatedAt: number
  }
}

Errors

StatusMessage
429Too many requests to Customers this minute. Try again shortly.

GET /v1/orgs/:orgId/crm/objects/:object

One object with its fields, validation rules and indexes.

Auth: user access token or platform agent key · Scope: crm:read

Path parameterDescription
:orgIdOrganization id (org_…).
:objectAn object's id in Customers: account, contact, lead, opportunity, activity, or a custom object's (x_…).

Response 200

{
  object: {
    id: string
    label: string
    plural: string
    prefix: string
    glyph: string
    custom?: boolean
    nameFields: string[]
    fields: {
      id: string
      label: string
      type: "number" | "text" | "email" | "url" | "date" | "owner" | "pipeline" | "phone" | "textarea" | "checkbox" | "currency" | "stage" | "lookup" | "datetime" | "percent" | "picklist" | "multipicklist" | "lookups"
      required?: boolean
      custom?: boolean
      system?: boolean
      readOnly?: boolean
      searchable?: boolean
      help?: string
      maxLength?: number
      min?: number
      max?: number
      decimals?: number
      values?: {
        value: string
        label?: string
        inactive?: boolean
      }[]
      target?: string
      convertTo?: {
        object: "contact" | "account" | "opportunity"
        field: string
      }
    }[]
    rules: {
      id: string
      name: string
      active: boolean
      when: {
        field: string
        op: "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
        value?: unknown
      }[]
      require: {
        field: string
        op: "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
        value?: unknown
      }[]
      message: string
      field?: string
    }[]
    sharing: "private" | "read" | "readwrite"
    indexes: {
      id: string
      eq: string[]
      sort: string
      status: "building" | "ready"
      builtin?: boolean
      createdAt: number
    }[]
    indexShards: number
    listColumns: string[]
    subtitleFields: string[]
    version: number
    createdAt: number
    updatedAt: number
  }
}

Errors

StatusMessage
429Too many requests to Customers this minute. Try again shortly.

PATCH /v1/orgs/:orgId/crm/objects/:object

Labels, sharing default, default columns and search subtitle (Customers admins), over version.

Auth: user access token or platform agent key · Scopes: crm:read, crm:admin

Path parameterDescription
:orgIdOrganization id (org_…).
:objectAn object's id in Customers: account, contact, lead, opportunity, activity, or a custom object's (x_…).

Request body

FieldTypeRequiredNotes
versionintegerYes
labelstringNoup to 60 characters; trimmed
pluralstringNoup to 60 characters; trimmed
sharing"private" | "read" | "readwrite"No
listColumnsstring[]Noup to 30 items; each 1–60 characters
subtitleFieldsstring[]Noup to 5 items; each 1–60 characters

Response 200

{
  object: {
    id: string
    label: string
    plural: string
    prefix: string
    glyph: string
    custom?: boolean
    nameFields: string[]
    fields: {
      id: string
      label: string
      type: "number" | "text" | "email" | "url" | "date" | "owner" | "pipeline" | "phone" | "textarea" | "checkbox" | "currency" | "stage" | "lookup" | "datetime" | "percent" | "picklist" | "multipicklist" | "lookups"
      required?: boolean
      custom?: boolean
      system?: boolean
      readOnly?: boolean
      searchable?: boolean
      help?: string
      maxLength?: number
      min?: number
      max?: number
      decimals?: number
      values?: {
        value: string
        label?: string
        inactive?: boolean
      }[]
      target?: string
      convertTo?: {
        object: "contact" | "account" | "opportunity"
        field: string
      }
    }[]
    rules: {
      id: string
      name: string
      active: boolean
      when: {
        field: string
        op: "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
        value?: unknown
      }[]
      require: {
        field: string
        op: "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
        value?: unknown
      }[]
      message: string
      field?: string
    }[]
    sharing: "private" | "read" | "readwrite"
    indexes: {
      id: string
      eq: string[]
      sort: string
      status: "building" | "ready"
      builtin?: boolean
      createdAt: number
    }[]
    indexShards: number
    listColumns: string[]
    subtitleFields: string[]
    version: number
    createdAt: number
    updatedAt: number
  }
}

Errors

StatusMessage
429Too many requests to Customers this minute. Try again shortly.

DELETE /v1/orgs/:orgId/crm/objects/:object

Deletes a custom object without records.

Auth: user access token or platform agent key · Scopes: crm:read, crm:admin

Path parameterDescription
:orgIdOrganization id (org_…).
:objectAn object's id in Customers: account, contact, lead, opportunity, activity, or a custom object's (x_…).

Response 200

{
  ok: true
}

Errors

StatusMessage
429Too many requests to Customers this minute. Try again shortly.

POST /v1/orgs/:orgId/crm/objects/:object/fields

Adds a custom field (Customers admins): text, number, currency, date, picklist, multi-picklist, checkbox, lookup, email, phone or URL; required makes it required.

Auth: user access token or platform agent key · Scopes: crm:read, crm:admin

Path parameterDescription
:orgIdOrganization id (org_…).
:objectAn object's id in Customers: account, contact, lead, opportunity, activity, or a custom object's (x_…).

Request body

FieldTypeRequiredDefaultNotes
labelstringYes1–80 characters; trimmed
type"text" | "textarea" | "number" | "currency" | "percent" | "date" | "datetime" | "picklist" | "multipicklist" | "checkbox" | "lookup" | "email" | "phone" | "url"Yes
requiredbooleanNo
helpstringNoup to 255 characters
searchablebooleanNo
maxLengthintegerNo1–32000
minnumberNo
maxnumberNo
decimalsintegerNo0–6
valuesobject[]Noup to 2,000 items
values[].valuestringNo""up to 80 characters
values[].labelstringNoup to 80 characters
values[].inactivebooleanNo
targetstringNoup to 40 characters
convertToobjectNo
convertTo.object"account" | "contact" | "opportunity"Yes
convertTo.fieldstringYes1–60 characters

Response 201

{
  object: {
    id: string
    label: string
    plural: string
    prefix: string
    glyph: string
    custom?: boolean
    nameFields: string[]
    fields: {
      id: string
      label: string
      type: "number" | "text" | "email" | "url" | "date" | "owner" | "pipeline" | "phone" | "textarea" | "checkbox" | "currency" | "stage" | "lookup" | "datetime" | "percent" | "picklist" | "multipicklist" | "lookups"
      required?: boolean
      custom?: boolean
      system?: boolean
      readOnly?: boolean
      searchable?: boolean
      help?: string
      maxLength?: number
      min?: number
      max?: number
      decimals?: number
      values?: {
        value: string
        label?: string
        inactive?: boolean
      }[]
      target?: string
      convertTo?: {
        object: "contact" | "account" | "opportunity"
        field: string
      }
    }[]
    rules: {
      id: string
      name: string
      active: boolean
      when: {
        field: string
        op: "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
        value?: unknown
      }[]
      require: {
        field: string
        op: "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
        value?: unknown
      }[]
      message: string
      field?: string
    }[]
    sharing: "private" | "read" | "readwrite"
    indexes: {
      id: string
      eq: string[]
      sort: string
      status: "building" | "ready"
      builtin?: boolean
      createdAt: number
    }[]
    indexShards: number
    listColumns: string[]
    subtitleFields: string[]
    version: number
    createdAt: number
    updatedAt: number
  }
  field: {
    id: string
    label: string
    type: "number" | "text" | "email" | "url" | "date" | "owner" | "pipeline" | "phone" | "textarea" | "checkbox" | "currency" | "stage" | "lookup" | "datetime" | "percent" | "picklist" | "multipicklist" | "lookups"
    required?: boolean
    custom?: boolean
    system?: boolean
    readOnly?: boolean
    searchable?: boolean
    help?: string
    maxLength?: number
    min?: number
    max?: number
    decimals?: number
    values?: {
      value: string
      label?: string
      inactive?: boolean
    }[]
    target?: string
    convertTo?: {
      object: "contact" | "account" | "opportunity"
      field: string
    }
  }
}

Errors

StatusMessage
429Too many requests to Customers this minute. Try again shortly.

PATCH /v1/orgs/:orgId/crm/objects/:object/fields/:field

Changes a field's label, help, required, picklist values or lookup, over the object's version.

Auth: user access token or platform agent key · Scopes: crm:read, crm:admin

Path parameterDescription
:orgIdOrganization id (org_…).
:objectAn object's id in Customers: account, contact, lead, opportunity, activity, or a custom object's (x_…).
:fieldA field's id in Customers, as GET …/crm/objects/:object lists them (custom fields x_…).

Request body

FieldTypeRequiredDefaultNotes
labelstringNo1–80 characters; trimmed
requiredbooleanNo
helpstringNoup to 255 characters
searchablebooleanNo
maxLengthintegerNo1–32000
minnumberNo
maxnumberNo
decimalsintegerNo0–6
valuesobject[]Noup to 2,000 items
values[].valuestringNo""up to 80 characters
values[].labelstringNoup to 80 characters
values[].inactivebooleanNo
versionintegerYes
convertToany JSONYescan be null

Response 200

{
  object: {
    id: string
    label: string
    plural: string
    prefix: string
    glyph: string
    custom?: boolean
    nameFields: string[]
    fields: {
      id: string
      label: string
      type: "number" | "text" | "email" | "url" | "date" | "owner" | "pipeline" | "phone" | "textarea" | "checkbox" | "currency" | "stage" | "lookup" | "datetime" | "percent" | "picklist" | "multipicklist" | "lookups"
      required?: boolean
      custom?: boolean
      system?: boolean
      readOnly?: boolean
      searchable?: boolean
      help?: string
      maxLength?: number
      min?: number
      max?: number
      decimals?: number
      values?: {
        value: string
        label?: string
        inactive?: boolean
      }[]
      target?: string
      convertTo?: {
        object: "contact" | "account" | "opportunity"
        field: string
      }
    }[]
    rules: {
      id: string
      name: string
      active: boolean
      when: {
        field: string
        op: "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
        value?: unknown
      }[]
      require: {
        field: string
        op: "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
        value?: unknown
      }[]
      message: string
      field?: string
    }[]
    sharing: "private" | "read" | "readwrite"
    indexes: {
      id: string
      eq: string[]
      sort: string
      status: "building" | "ready"
      builtin?: boolean
      createdAt: number
    }[]
    indexShards: number
    listColumns: string[]
    subtitleFields: string[]
    version: number
    createdAt: number
    updatedAt: number
  }
  field: {
    id: string
    label: string
    type: "number" | "text" | "email" | "url" | "date" | "owner" | "pipeline" | "phone" | "textarea" | "checkbox" | "currency" | "stage" | "lookup" | "datetime" | "percent" | "picklist" | "multipicklist" | "lookups"
    required?: boolean
    custom?: boolean
    system?: boolean
    readOnly?: boolean
    searchable?: boolean
    help?: string
    maxLength?: number
    min?: number
    max?: number
    decimals?: number
    values?: {
      value: string
      label?: string
      inactive?: boolean
    }[]
    target?: string
    convertTo?: {
      object: "contact" | "account" | "opportunity"
      field: string
    }
  }
}

Errors

StatusMessage
429Too many requests to Customers this minute. Try again shortly.

DELETE /v1/orgs/:orgId/crm/objects/:object/fields/:field

Deletes a custom field, with its rules and indexes (their entries go in the background).

Auth: user access token or platform agent key · Scopes: crm:read, crm:admin

Path parameterDescription
:orgIdOrganization id (org_…).
:objectAn object's id in Customers: account, contact, lead, opportunity, activity, or a custom object's (x_…).
:fieldA field's id in Customers, as GET …/crm/objects/:object lists them (custom fields x_…).
Query parameterTypeRequiredNotes
versionintegerYescoerced from a string

Response 200

{
  object: {
    id: string
    label: string
    plural: string
    prefix: string
    glyph: string
    custom?: boolean
    nameFields: string[]
    fields: {
      id: string
      label: string
      type: "number" | "text" | "email" | "url" | "date" | "owner" | "pipeline" | "phone" | "textarea" | "checkbox" | "currency" | "stage" | "lookup" | "datetime" | "percent" | "picklist" | "multipicklist" | "lookups"
      required?: boolean
      custom?: boolean
      system?: boolean
      readOnly?: boolean
      searchable?: boolean
      help?: string
      maxLength?: number
      min?: number
      max?: number
      decimals?: number
      values?: {
        value: string
        label?: string
        inactive?: boolean
      }[]
      target?: string
      convertTo?: {
        object: "contact" | "account" | "opportunity"
        field: string
      }
    }[]
    rules: {
      id: string
      name: string
      active: boolean
      when: {
        field: string
        op: "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
        value?: unknown
      }[]
      require: {
        field: string
        op: "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
        value?: unknown
      }[]
      message: string
      field?: string
    }[]
    sharing: "private" | "read" | "readwrite"
    indexes: {
      id: string
      eq: string[]
      sort: string
      status: "building" | "ready"
      builtin?: boolean
      createdAt: number
    }[]
    indexShards: number
    listColumns: string[]
    subtitleFields: string[]
    version: number
    createdAt: number
    updatedAt: number
  }
}

Errors

StatusMessage
429Too many requests to Customers this minute. Try again shortly.

PUT /v1/orgs/:orgId/crm/objects/:object/rules

Replaces the object's validation rules.

Auth: user access token or platform agent key · Scopes: crm:read, crm:admin

Path parameterDescription
:orgIdOrganization id (org_…).
:objectAn object's id in Customers: account, contact, lead, opportunity, activity, or a custom object's (x_…).

Request body

FieldTypeRequiredNotes
versionintegerYes
rulesobject[]Yesup to 500 items
rules[].idstringYesup to 40 characters
rules[].namestringYes1–80 characters; trimmed
rules[].activebooleanYes
rules[].whenobject[]Yesup to 10 items
rules[].when[].fieldstringYes1–60 characters
rules[].when[].op"eq" | "ne" | "gt" | "gte" | "lt" | "lte" | "contains" | "blank" | "notBlank"Yes
rules[].when[].valueany JSONNo
rules[].requireobject[]Yes1–10 items
rules[].require[].fieldstringYes1–60 characters
rules[].require[].op"eq" | "ne" | "gt" | "gte" | "lt" | "lte" | "contains" | "blank" | "notBlank"Yes
rules[].require[].valueany JSONNo
rules[].messagestringYes1–255 characters; trimmed
rules[].fieldstringNo1–60 characters

Response 200

{
  object: {
    id: string
    label: string
    plural: string
    prefix: string
    glyph: string
    custom?: boolean
    nameFields: string[]
    fields: {
      id: string
      label: string
      type: "number" | "text" | "email" | "url" | "date" | "owner" | "pipeline" | "phone" | "textarea" | "checkbox" | "currency" | "stage" | "lookup" | "datetime" | "percent" | "picklist" | "multipicklist" | "lookups"
      required?: boolean
      custom?: boolean
      system?: boolean
      readOnly?: boolean
      searchable?: boolean
      help?: string
      maxLength?: number
      min?: number
      max?: number
      decimals?: number
      values?: {
        value: string
        label?: string
        inactive?: boolean
      }[]
      target?: string
      convertTo?: {
        object: "contact" | "account" | "opportunity"
        field: string
      }
    }[]
    rules: {
      id: string
      name: string
      active: boolean
      when: {
        field: string
        op: "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
        value?: unknown
      }[]
      require: {
        field: string
        op: "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
        value?: unknown
      }[]
      message: string
      field?: string
    }[]
    sharing: "private" | "read" | "readwrite"
    indexes: {
      id: string
      eq: string[]
      sort: string
      status: "building" | "ready"
      builtin?: boolean
      createdAt: number
    }[]
    indexShards: number
    listColumns: string[]
    subtitleFields: string[]
    version: number
    createdAt: number
    updatedAt: number
  }
}

Errors

StatusMessage
429Too many requests to Customers this minute. Try again shortly.

POST /v1/orgs/:orgId/crm/objects/:object/indexes

Adds an index (built in the background): up to two equality fields and a sort field.

Auth: user access token or platform agent key · Scopes: crm:read, crm:admin

Path parameterDescription
:orgIdOrganization id (org_…).
:objectAn object's id in Customers: account, contact, lead, opportunity, activity, or a custom object's (x_…).

Request body

FieldTypeRequiredNotes
eqstring[]Yesup to 2 items; each 1–60 characters
sortstringYes1–60 characters

Response 201

{
  index: {
    id: string
    eq: string[]
    sort: string
    status: "building" | "ready"
    builtin?: boolean
    createdAt: number
  }
}

Errors

StatusMessage
429Too many requests to Customers this minute. Try again shortly.

DELETE /v1/orgs/:orgId/crm/objects/:object/indexes/:indexId

Drops a custom index (its entries go in the background); built-in ones stay.

Auth: user access token or platform agent key · Scopes: crm:read, crm:admin

Path parameterDescription
:orgIdOrganization id (org_…).
:objectAn object's id in Customers: account, contact, lead, opportunity, activity, or a custom object's (x_…).
:indexIdA list view index's id in Customers (ix…), as the object's indexes list them.

Response 200

{
  object: {
    id: string
    label: string
    plural: string
    prefix: string
    glyph: string
    custom?: boolean
    nameFields: string[]
    fields: {
      id: string
      label: string
      type: "number" | "text" | "email" | "url" | "date" | "owner" | "pipeline" | "phone" | "textarea" | "checkbox" | "currency" | "stage" | "lookup" | "datetime" | "percent" | "picklist" | "multipicklist" | "lookups"
      required?: boolean
      custom?: boolean
      system?: boolean
      readOnly?: boolean
      searchable?: boolean
      help?: string
      maxLength?: number
      min?: number
      max?: number
      decimals?: number
      values?: {
        value: string
        label?: string
        inactive?: boolean
      }[]
      target?: string
      convertTo?: {
        object: "contact" | "account" | "opportunity"
        field: string
      }
    }[]
    rules: {
      id: string
      name: string
      active: boolean
      when: {
        field: string
        op: "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
        value?: unknown
      }[]
      require: {
        field: string
        op: "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
        value?: unknown
      }[]
      message: string
      field?: string
    }[]
    sharing: "private" | "read" | "readwrite"
    indexes: {
      id: string
      eq: string[]
      sort: string
      status: "building" | "ready"
      builtin?: boolean
      createdAt: number
    }[]
    indexShards: number
    listColumns: string[]
    subtitleFields: string[]
    version: number
    createdAt: number
    updatedAt: number
  }
}

Errors

StatusMessage
429Too many requests to Customers this minute. Try again shortly.

GET /v1/orgs/:orgId/crm/objects/:object/views

Built-in, shared and the caller's own list views.

Auth: user access token or platform agent key · Scope: crm:read

Path parameterDescription
:orgIdOrganization id (org_…).
:objectAn object's id in Customers: account, contact, lead, opportunity, activity, or a custom object's (x_…).

Response 200

{
  views: {
    id: string
    object: string
    name: string
    ownerId?: string
    filters: {
      field: string
      op: "in" | "startsWith" | "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
      value?: unknown
    }[]
    sort: {
      field: string
      dir: "asc" | "desc"
    }
    columns: string[]
    builtin?: boolean
    createdAt: number
    updatedAt: number
  }[]
}

Errors

StatusMessage
429Too many requests to Customers this minute. Try again shortly.

POST /v1/orgs/:orgId/crm/objects/:object/views

Saves a view (shared ones: Customers admins); an index it needs is added and built.

Auth: user access token or platform agent key · Scope: crm:read

Path parameterDescription
:orgIdOrganization id (org_…).
:objectAn object's id in Customers: account, contact, lead, opportunity, activity, or a custom object's (x_…).

Request body

FieldTypeRequiredDefaultNotes
namestringYes1–80 characters; trimmed
filtersobject[]No[]up to 20 items
filters[].fieldstringYes1–60 characters
filters[].op"eq" | "ne" | "in" | "gt" | "gte" | "lt" | "lte" | "contains" | "startsWith" | "blank" | "notBlank"Yes
filters[].valueany JSONNo
sortobjectYes
sort.fieldstringYes1–60 characters
sort.dir"asc" | "desc"Yes
columnsstring[]No[]up to 30 items; each 1–60 characters
sharedbooleanNo

Response 201

{
  view: {
    id: string
    object: string
    name: string
    ownerId?: string
    filters: {
      field: string
      op: "in" | "startsWith" | "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
      value?: unknown
    }[]
    sort: {
      field: string
      dir: "asc" | "desc"
    }
    columns: string[]
    builtin?: boolean
    createdAt: number
    updatedAt: number
  }
  index?: {
    id: string
    eq: string[]
    sort: string
    status: "building" | "ready"
    builtin?: boolean
    createdAt: number
  }
}

Errors

StatusMessage
429Too many requests to Customers this minute. Try again shortly.

PATCH /v1/orgs/:orgId/crm/objects/:object/views/:viewId

Changes a saved view (the caller's own; shared ones: Customers admins).

Auth: user access token or platform agent key · Scope: crm:read

Path parameterDescription
:orgIdOrganization id (org_…).
:objectAn object's id in Customers: account, contact, lead, opportunity, activity, or a custom object's (x_…).
:viewIdA list view: all, mine, recent or a saved view's id (cvw_…).

Request body

FieldTypeRequiredDefaultNotes
namestringYes1–80 characters; trimmed
filtersobject[]No[]up to 20 items
filters[].fieldstringYes1–60 characters
filters[].op"eq" | "ne" | "in" | "gt" | "gte" | "lt" | "lte" | "contains" | "startsWith" | "blank" | "notBlank"Yes
filters[].valueany JSONNo
sortobjectYes
sort.fieldstringYes1–60 characters
sort.dir"asc" | "desc"Yes
columnsstring[]No[]up to 30 items; each 1–60 characters
sharedbooleanNo

Response 200

{
  view: {
    id: string
    object: string
    name: string
    ownerId?: string
    filters: {
      field: string
      op: "in" | "startsWith" | "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
      value?: unknown
    }[]
    sort: {
      field: string
      dir: "asc" | "desc"
    }
    columns: string[]
    builtin?: boolean
    createdAt: number
    updatedAt: number
  }
  index?: {
    id: string
    eq: string[]
    sort: string
    status: "building" | "ready"
    builtin?: boolean
    createdAt: number
  }
}

Errors

StatusMessage
429Too many requests to Customers this minute. Try again shortly.

DELETE /v1/orgs/:orgId/crm/objects/:object/views/:viewId

Deletes a saved view (the caller's own; shared ones: Customers admins).

Auth: user access token or platform agent key · Scope: crm:read

Path parameterDescription
:orgIdOrganization id (org_…).
:objectAn object's id in Customers: account, contact, lead, opportunity, activity, or a custom object's (x_…).
:viewIdA list view: all, mine, recent or a saved view's id (cvw_…).

Response 200

{
  ok: true
}

Errors

StatusMessage
429Too many requests to Customers this minute. Try again shortly.

GET /v1/orgs/:orgId/crm/objects/:object/records

A page of records by a view, or filters (JSON) and sort; cursor continues.

Auth: user access token or platform agent key · Scope: crm:read

Path parameterDescription
:orgIdOrganization id (org_…).
:objectAn object's id in Customers: account, contact, lead, opportunity, activity, or a custom object's (x_…).
Query parameterTypeRequiredDefaultNotes
viewstringNoup to 40 characters
filtersstringNoup to 8,000 characters
sortstringNoup to 80 characters
cursorstringNoup to 8,000 characters
limitintegerNo501–200; coerced from a string

Response 200

{
  names: {
    records: {
      [key: string]: {
        id: string
        name: string
        object: string
      }
    }
    people: {
      [key: string]: string
    }
  }
  records: {
    id: string
    object: string
    version: number
    ownerId: string
    name: string
    fields: {
      [key: string]: unknown
    }
    createdAt: number
    updatedAt: number
    createdBy: string
    updatedBy: string
    via: "api" | "mcp" | "calendar" | "app" | "system" | "import" | "mail" | "marketing" | "convert"
  }[]
  cursor?: string
  total?: number
  missingIndex?: {
    eq: string[]
    sort: string
  }
  partial?: boolean
  plan: {
    index: string
    exactSort: boolean
    memorySort: boolean
  }
}

Errors

StatusMessage
400filters: a JSON list of { field, op, value }.
400sort: field:asc or field:desc.
429Too many requests to Customers this minute. Try again shortly.

POST /v1/orgs/:orgId/crm/objects/:object/records/query

The same list with the filters in the body.

Auth: user access token or platform agent key · Scope: crm:read

Path parameterDescription
:orgIdOrganization id (org_…).
:objectAn object's id in Customers: account, contact, lead, opportunity, activity, or a custom object's (x_…).

Request body

FieldTypeRequiredDefaultNotes
viewstringNoup to 40 characters
filtersobject[]Noup to 20 items
filters[].fieldstringYes1–60 characters
filters[].op"eq" | "ne" | "in" | "gt" | "gte" | "lt" | "lte" | "contains" | "startsWith" | "blank" | "notBlank"Yes
filters[].valueany JSONNo
sortobjectNo
sort.fieldstringYes1–60 characters
sort.dir"asc" | "desc"Yes
cursorstringNoup to 8,000 characters
limitintegerNo501–200

Response 200

{
  names: {
    records: {
      [key: string]: {
        id: string
        name: string
        object: string
      }
    }
    people: {
      [key: string]: string
    }
  }
  records: {
    id: string
    object: string
    version: number
    ownerId: string
    name: string
    fields: {
      [key: string]: unknown
    }
    createdAt: number
    updatedAt: number
    createdBy: string
    updatedBy: string
    via: "api" | "mcp" | "calendar" | "app" | "system" | "import" | "mail" | "marketing" | "convert"
  }[]
  cursor?: string
  total?: number
  missingIndex?: {
    eq: string[]
    sort: string
  }
  partial?: boolean
  plan: {
    index: string
    exactSort: boolean
    memorySort: boolean
  }
}

Errors

StatusMessage
429Too many requests to Customers this minute. Try again shortly.

POST /v1/orgs/:orgId/crm/objects/:object/records

Creates a record owned by the caller (or ownerId); field errors come back as 422 with errors.

Auth: user access token or platform agent key · Scopes: crm:read, crm:write

Path parameterDescription
:orgIdOrganization id (org_…).
:objectAn object's id in Customers: account, contact, lead, opportunity, activity, or a custom object's (x_…).

Request body

FieldTypeRequiredNotes
fieldsobjectYeskeys up to 60 characters; values: any JSON
ownerIdstringNoup to 40 characters

Response 201

{
  record: {
    id: string
    object: string
    version: number
    ownerId: string
    name: string
    fields: {
      [key: string]: unknown
    }
    createdAt: number
    updatedAt: number
    createdBy: string
    updatedBy: string
    via: "api" | "mcp" | "calendar" | "app" | "system" | "import" | "mail" | "marketing" | "convert"
  }
}

Errors

StatusMessage
429Too many requests to Customers this minute. Try again shortly.

POST /v1/orgs/:orgId/crm/objects/:object/records/bulk

Updates, transfers or deletes many records; each reports its own result.

Auth: user access token or platform agent key · Scopes: crm:read, crm:write

Path parameterDescription
:orgIdOrganization id (org_…).
:objectAn object's id in Customers: account, contact, lead, opportunity, activity, or a custom object's (x_…).

Request body

FieldTypeRequiredNotes
idsstring[]Yes1–1,000 items; each matches ^[a-z][a-z0-9]{1,5}_[0-9a-z]{26}$
operation"update" | "transfer" | "delete"Yes
fieldsobjectNokeys up to 60 characters; values: any JSON
ownerIdstringNoup to 40 characters

Response 200

{
  results: {
    id: string
    ok: true
    error?: undefined
  } | {
    id: string
    ok: false
    error: string
  }[]
}

Errors

StatusMessage
400ownerId: who gets the records.
429Too many requests to Customers this minute. Try again shortly.

GET /v1/orgs/:orgId/crm/objects/:object/export

A view (or filters) as CSV, up to 10,000 rows; X-More: 1 when there are more (use an export job).

Auth: user access token or platform agent key · Scope: crm:read

Path parameterDescription
:orgIdOrganization id (org_…).
:objectAn object's id in Customers: account, contact, lead, opportunity, activity, or a custom object's (x_…).
Query parameterTypeRequiredNotes
viewstringNoup to 40 characters
filtersstringNoup to 8,000 characters
sortstringNoup to 80 characters
columnsstringNoup to 2,000 characters

Response 200 with no body.

Errors

StatusMessage
400filters: a JSON list of { field, op, value }.
400sort: field:asc or field:desc.
429Too many requests to Customers this minute. Try again shortly.

POST /v1/orgs/:orgId/crm/objects/:object/exports

Exports a view to a file in the background (any size); download it from the job when done.

Auth: user access token or platform agent key · Scope: crm:read

Path parameterDescription
:orgIdOrganization id (org_…).
:objectAn object's id in Customers: account, contact, lead, opportunity, activity, or a custom object's (x_…).

Request body

FieldTypeRequiredNotes
viewstringNoup to 40 characters
filtersobject[]Noup to 20 items
filters[].fieldstringYes1–60 characters
filters[].op"eq" | "ne" | "in" | "gt" | "gte" | "lt" | "lte" | "contains" | "startsWith" | "blank" | "notBlank"Yes
filters[].valueany JSONNo
sortobjectNo
sort.fieldstringYes1–60 characters
sort.dir"asc" | "desc"Yes
columnsstring[]Noup to 60 items; each 1–60 characters

Response 202

{
  job: {
    id: string
    kind: "import" | "export"
    object: string
    state: "queued" | "ready" | "done" | "failed" | "uploading" | "running"
    fileName: string
    fileKey: string
    size: number
    headers?: string[]
    mapping?: string[]
    options?: {
      mode: "create" | "upsert"
      ownerId?: string
      dateOrder: "iso" | "dmy" | "mdy"
    }
    view?: {
      viewId?: string
      filters?: unknown[]
      sort?: unknown
      columns?: string[]
    }
    progress: {
      rows: number
      created: number
      updated: number
      failed: number
      offset: number
    }
    errors: {
      row: number
      message: string
    }[]
    error?: string
    createdBy: string
    createdByLabel: string
    createdAt: number
    updatedAt: number
  }
}

Errors

StatusMessage
429Too many requests to Customers this minute. Try again shortly.

GET /v1/orgs/:orgId/crm/records/:id

The record, what the caller may do with it, and names of the people and records it refers to.

Auth: user access token or platform agent key · Scope: crm:read

Path parameterDescription
:orgIdOrganization id (org_…).
:idA record's id in Customers: its object's prefix and a time-sortable id (acc_…, cnt_…, led_…, opp_…, act_…).

Response 200

{
  record: {
    id: string
    object: string
    version: number
    ownerId: string
    name: string
    fields: {
      [key: string]: unknown
    }
    createdAt: number
    updatedAt: number
    createdBy: string
    updatedBy: string
    via: "api" | "mcp" | "calendar" | "app" | "system" | "import" | "mail" | "marketing" | "convert"
  }
  object: string
  access: {
    read: boolean
    edit: boolean
    delete: boolean
    transfer: boolean
  }
  names: {
    records: {
      [key: string]: {
        id: string
        name: string
        object: string
      }
    }
    people: {
      [key: string]: string
    }
  }
}

Errors

StatusMessage
429Too many requests to Customers this minute. Try again shortly.

PATCH /v1/orgs/:orgId/crm/records/:id

Changes fields and the owner; version refuses a stale edit (409).

Auth: user access token or platform agent key · Scopes: crm:read, crm:write

Path parameterDescription
:orgIdOrganization id (org_…).
:idA record's id in Customers: its object's prefix and a time-sortable id (acc_…, cnt_…, led_…, opp_…, act_…).

Request body

FieldTypeRequiredNotes
fieldsobjectNokeys up to 60 characters; values: any JSON
ownerIdstringNoup to 40 characters
versionintegerNo

Response 200

{
  record: {
    id: string
    object: string
    version: number
    ownerId: string
    name: string
    fields: {
      [key: string]: unknown
    }
    createdAt: number
    updatedAt: number
    createdBy: string
    updatedBy: string
    via: "api" | "mcp" | "calendar" | "app" | "system" | "import" | "mail" | "marketing" | "convert"
  }
}

Errors

StatusMessage
429Too many requests to Customers this minute. Try again shortly.

DELETE /v1/orgs/:orgId/crm/records/:id

Deletes the record; its history and the audit log keep who deleted it.

Auth: user access token or platform agent key · Scopes: crm:read, crm:write

Path parameterDescription
:orgIdOrganization id (org_…).
:idA record's id in Customers: its object's prefix and a time-sortable id (acc_…, cnt_…, led_…, opp_…, act_…).

Response 200

{
  ok: true
}

Errors

StatusMessage
429Too many requests to Customers this minute. Try again shortly.

GET /v1/orgs/:orgId/crm/records/:id/history

Field changes, newest first.

Auth: user access token or platform agent key · Scope: crm:read

Path parameterDescription
:orgIdOrganization id (org_…).
:idA record's id in Customers: its object's prefix and a time-sortable id (acc_…, cnt_…, led_…, opp_…, act_…).
Query parameterTypeRequiredDefaultNotes
cursorstringNoup to 2,000 characters
limitintegerNo501–200; coerced from a string

Response 200

{
  entries: {
    at: number
    version: number
    actor: string
    via: "api" | "mcp" | "calendar" | "app" | "system" | "import" | "mail" | "marketing" | "convert"
    kind: "deleted" | "created" | "updated" | "converted"
    changes: {
      field: string
      from?: unknown
      to?: unknown
    }[]
  }[]
  cursor?: string
}

Errors

StatusMessage
429Too many requests to Customers this minute. Try again shortly.

Records of other objects that look up to this one (a few of each).

Auth: user access token or platform agent key · Scope: crm:read

Path parameterDescription
:orgIdOrganization id (org_…).
:idA record's id in Customers: its object's prefix and a time-sortable id (acc_…, cnt_…, led_…, opp_…, act_…).

Response 200

{
  lists: {
    object: string
    field: string
    label: string
    records: {
      id: string
      object: string
      version: number
      ownerId: string
      name: string
      fields: {
        [key: string]: unknown
      }
      createdAt: number
      updatedAt: number
      createdBy: string
      updatedBy: string
      via: "api" | "mcp" | "calendar" | "app" | "system" | "import" | "mail" | "marketing" | "convert"
    }[]
    more: boolean
  }[]
  names: {
    [key: string]: {
      records: {
        [key: string]: {
          id: string
          name: string
          object: string
        }
      }
      people: {
        [key: string]: string
      }
    }
  }
}

Errors

StatusMessage
429Too many requests to Customers this minute. Try again shortly.

GET /v1/orgs/:orgId/crm/records/:id/activities

The timeline: activities related to the record, newest first.

Auth: user access token or platform agent key · Scope: crm:read

Path parameterDescription
:orgIdOrganization id (org_…).
:idA record's id in Customers: its object's prefix and a time-sortable id (acc_…, cnt_…, led_…, opp_…, act_…).
Query parameterTypeRequiredDefaultNotes
cursorstringNoup to 8,000 characters
limitintegerNo251–100; coerced from a string
type"task" | "call" | "meeting" | "note" | "email"No

Response 200

{
  names: {
    records: {
      [key: string]: {
        id: string
        name: string
        object: string
      }
    }
    people: {
      [key: string]: string
    }
  }
  records: {
    id: string
    object: string
    version: number
    ownerId: string
    name: string
    fields: {
      [key: string]: unknown
    }
    createdAt: number
    updatedAt: number
    createdBy: string
    updatedBy: string
    via: "api" | "mcp" | "calendar" | "app" | "system" | "import" | "mail" | "marketing" | "convert"
  }[]
  cursor?: string
  total?: number
  missingIndex?: {
    eq: string[]
    sort: string
  }
  partial?: boolean
  plan: {
    index: string
    exactSort: boolean
    memorySort: boolean
  }
}

Errors

StatusMessage
429Too many requests to Customers this minute. Try again shortly.

POST /v1/orgs/:orgId/crm/records/:id/activities

Logs a task, call, meeting, note or email on the record (and any others in relatedIds).

Auth: user access token or platform agent key · Scopes: crm:read, crm:write

Path parameterDescription
:orgIdOrganization id (org_…).
:idA record's id in Customers: its object's prefix and a time-sortable id (acc_…, cnt_…, led_…, opp_…, act_…).

Request body

FieldTypeRequiredDefaultNotes
type"task" | "call" | "meeting" | "note" | "email"Yes
subjectstringYes1–255 characters; trimmed
bodystringNoup to 32,000 characters
status"open" | "completed"No
dueDatestringNomatches ^\d{4}-\d{2}-\d{2}$
startAtnumber | stringNoup to 40 characters
endAtnumber | stringNoup to 40 characters
durationMinutesintegerNo0–100000
direction"inbound" | "outbound"No
relatedIdsstring[]No[]up to 24 items; each matches ^[a-z][a-z0-9]{1,5}_[0-9a-z]{26}$
ownerIdstringNoup to 40 characters

Response 201

{
  record: {
    id: string
    object: string
    version: number
    ownerId: string
    name: string
    fields: {
      [key: string]: unknown
    }
    createdAt: number
    updatedAt: number
    createdBy: string
    updatedBy: string
    via: "api" | "mcp" | "calendar" | "app" | "system" | "import" | "mail" | "marketing" | "convert"
  }
}

Errors

StatusMessage
429Too many requests to Customers this minute. Try again shortly.

POST /v1/orgs/:orgId/crm/records/:id/convert

Converts a lead into an account (or uses one), a contact (or uses one) and an opportunity.

Auth: user access token or platform agent key · Scopes: crm:read, crm:write

Path parameterDescription
:orgIdOrganization id (org_…).
:idA record's id in Customers: its object's prefix and a time-sortable id (acc_…, cnt_…, led_…, opp_…, act_…).

Request body

FieldTypeRequiredDefaultNotes
accountIdstringNomatches ^[a-z][a-z0-9]{1,5}_[0-9a-z]{26}$
contactIdstringNomatches ^[a-z][a-z0-9]{1,5}_[0-9a-z]{26}$
createOpportunitybooleanNotrue
opportunityobjectNo
opportunity.namestringNoup to 255 characters
opportunity.pipelineIdstringNoup to 40 characters
opportunity.stagestringNoup to 40 characters
opportunity.amountnumberNo≥ 0
opportunity.closeDatestringNomatches ^\d{4}-\d{2}-\d{2}$
ownerIdstringNoup to 40 characters

Response 200

{
  lead: {
    id: string
    object: string
    version: number
    ownerId: string
    name: string
    fields: {
      [key: string]: unknown
    }
    createdAt: number
    updatedAt: number
    createdBy: string
    updatedBy: string
    via: "api" | "mcp" | "calendar" | "app" | "system" | "import" | "mail" | "marketing" | "convert"
  }
  accountId: string
  contactId: string
  opportunityId?: string
}

Errors

StatusMessage
429Too many requests to Customers this minute. Try again shortly.

GET /v1/orgs/:orgId/crm/pipelines

Opportunity pipelines with their stages.

Auth: user access token or platform agent key · Scope: crm:read

Path parameterDescription
:orgIdOrganization id (org_…).

Response 200

{
  pipelines: {
    id: string
    name: string
    stages: {
      id: string
      name: string
      probability: number
      category: "lost" | "open" | "won"
    }[]
    isDefault?: boolean
    order: number
    version: number
  }[]
}

Errors

StatusMessage
429Too many requests to Customers this minute. Try again shortly.

POST /v1/orgs/:orgId/crm/pipelines

A pipeline (Customers admins): stages with probability and whether each is open, won or lost.

Auth: user access token or platform agent key · Scopes: crm:read, crm:admin

Path parameterDescription
:orgIdOrganization id (org_…).

Request body

FieldTypeRequiredNotes
namestringYes1–80 characters; trimmed
stagesobject[]Yes3–30 items
stages[].idstringNoup to 40 characters
stages[].namestringYes1–60 characters; trimmed
stages[].probabilitynumberYes0–100
stages[].category"open" | "won" | "lost"Yes
isDefaultbooleanNo
orderintegerNo0–1000
versionintegerNo

Response 201

{
  pipeline: {
    id: string
    name: string
    stages: {
      id: string
      name: string
      probability: number
      category: "lost" | "open" | "won"
    }[]
    isDefault?: boolean
    order: number
    version: number
  }
}

Errors

StatusMessage
429Too many requests to Customers this minute. Try again shortly.

PUT /v1/orgs/:orgId/crm/pipelines/:pipelineId

Replaces a pipeline's name and stages (Customers admins), over version; a stage with deals can't be removed.

Auth: user access token or platform agent key · Scopes: crm:read, crm:admin

Path parameterDescription
:orgIdOrganization id (org_…).
:pipelineIdA pipeline's id in Customers (sales, or pip_…).

Request body

FieldTypeRequiredNotes
namestringYes1–80 characters; trimmed
stagesobject[]Yes3–30 items
stages[].idstringNoup to 40 characters
stages[].namestringYes1–60 characters; trimmed
stages[].probabilitynumberYes0–100
stages[].category"open" | "won" | "lost"Yes
isDefaultbooleanNo
orderintegerNo0–1000
versionintegerNo

Response 200

{
  pipeline: {
    id: string
    name: string
    stages: {
      id: string
      name: string
      probability: number
      category: "lost" | "open" | "won"
    }[]
    isDefault?: boolean
    order: number
    version: number
  }
}

Errors

StatusMessage
429Too many requests to Customers this minute. Try again shortly.

DELETE /v1/orgs/:orgId/crm/pipelines/:pipelineId

Deletes a pipeline without opportunities (Customers admins); the default stays.

Auth: user access token or platform agent key · Scopes: crm:read, crm:admin

Path parameterDescription
:orgIdOrganization id (org_…).
:pipelineIdA pipeline's id in Customers (sales, or pip_…).

Response 200

{
  ok: true
}

Errors

StatusMessage
429Too many requests to Customers this minute. Try again shortly.

GET /v1/orgs/:orgId/crm/pipelines/:pipelineId/board

The board: each stage's first opportunities by close date with its count and amount; stage and cursor page one column.

Auth: user access token or platform agent key · Scope: crm:read

Path parameterDescription
:orgIdOrganization id (org_…).
:pipelineIdA pipeline's id in Customers (sales, or pip_…).
Query parameterTypeRequiredDefaultNotes
perStageintegerNo251–100; coerced from a string
stagestringNoup to 40 characters
cursorstringNoup to 8,000 characters
ownerstringNoup to 40 characters

Response 200

{
  names: {
    records: {
      [key: string]: {
        id: string
        name: string
        object: string
      }
    }
    people: {
      [key: string]: string
    }
  }
  pipeline: {
    id: string
    name: string
    stages: {
      id: string
      name: string
      probability: number
      category: "lost" | "open" | "won"
    }[]
    isDefault?: boolean
    order: number
    version: number
  }
  columns: {
    stage: {
      id: string
      name: string
      probability: number
      category: "lost" | "open" | "won"
    }
    records: {
      id: string
      object: string
      version: number
      ownerId: string
      name: string
      fields: {
        [key: string]: unknown
      }
      createdAt: number
      updatedAt: number
      createdBy: string
      updatedBy: string
      via: "api" | "mcp" | "calendar" | "app" | "system" | "import" | "mail" | "marketing" | "convert"
    }[]
    cursor?: string
    total: {
      count: number
      amount: number
    }
  }[]
}

Errors

StatusMessage
429Too many requests to Customers this minute. Try again shortly.

GET /v1/orgs/:orgId/crm/jobs

Recent imports and exports (the caller's; every one for Customers admins).

Auth: user access token or platform agent key · Scope: crm:read

Path parameterDescription
:orgIdOrganization id (org_…).

Response 200

{
  jobs: {
    id: string
    kind: "import" | "export"
    object: string
    state: "queued" | "ready" | "done" | "failed" | "uploading" | "running"
    fileName: string
    fileKey: string
    size: number
    headers?: string[]
    mapping?: string[]
    options?: {
      mode: "create" | "upsert"
      ownerId?: string
      dateOrder: "iso" | "dmy" | "mdy"
    }
    view?: {
      viewId?: string
      filters?: unknown[]
      sort?: unknown
      columns?: string[]
    }
    progress: {
      rows: number
      created: number
      updated: number
      failed: number
      offset: number
    }
    errors: {
      row: number
      message: string
    }[]
    error?: string
    createdBy: string
    createdByLabel: string
    createdAt: number
    updatedAt: number
  }[]
}

Errors

StatusMessage
429Too many requests to Customers this minute. Try again shortly.

GET /v1/orgs/:orgId/crm/jobs/:jobId

An import or export: state, progress counts and the first errors.

Auth: user access token or platform agent key · Scope: crm:read

Path parameterDescription
:orgIdOrganization id (org_…).
:jobIdJob id: an agent job (job_…), under pipelines a pipeline job (pjb_…), or under crm an import or export (cjb_…); under marketing a list import (mkj_…).

Response 200

{
  job: {
    id: string
    kind: "import" | "export"
    object: string
    state: "queued" | "ready" | "done" | "failed" | "uploading" | "running"
    fileName: string
    fileKey: string
    size: number
    headers?: string[]
    mapping?: string[]
    options?: {
      mode: "create" | "upsert"
      ownerId?: string
      dateOrder: "iso" | "dmy" | "mdy"
    }
    view?: {
      viewId?: string
      filters?: unknown[]
      sort?: unknown
      columns?: string[]
    }
    progress: {
      rows: number
      created: number
      updated: number
      failed: number
      offset: number
    }
    errors: {
      row: number
      message: string
    }[]
    error?: string
    createdBy: string
    createdByLabel: string
    createdAt: number
    updatedAt: number
  }
}

Errors

StatusMessage
429Too many requests to Customers this minute. Try again shortly.

GET /v1/orgs/:orgId/crm/jobs/:jobId/download

A finished export's download link (ten minutes).

Auth: user access token or platform agent key · Scope: crm:read

Path parameterDescription
:orgIdOrganization id (org_…).
:jobIdJob id: an agent job (job_…), under pipelines a pipeline job (pjb_…), or under crm an import or export (cjb_…); under marketing a list import (mkj_…).

Response 200

{
  url: string
}

Errors

StatusMessage
429Too many requests to Customers this minute. Try again shortly.

POST /v1/orgs/:orgId/crm/imports

Starts an import: up to 5 MB in content, or a presigned uploadUrl for the file (PUT it, then call uploaded).

Auth: user access token or platform agent key · Scopes: crm:read, crm:write

Path parameterDescription
:orgIdOrganization id (org_…).

Request body (up to 6 MB)

FieldTypeRequiredDefaultNotes
objectstringYesup to 40 characters
fileNamestringYesup to 200 characters
sizeintegerNo00–53687091200
contentstringNo

Response 201

{
  job: {
    id: string
    kind: "import" | "export"
    object: string
    state: "queued" | "ready" | "done" | "failed" | "uploading" | "running"
    fileName: string
    fileKey: string
    size: number
    headers?: string[]
    mapping?: string[]
    options?: {
      mode: "create" | "upsert"
      ownerId?: string
      dateOrder: "iso" | "dmy" | "mdy"
    }
    view?: {
      viewId?: string
      filters?: unknown[]
      sort?: unknown
      columns?: string[]
    }
    progress: {
      rows: number
      created: number
      updated: number
      failed: number
      offset: number
    }
    errors: {
      row: number
      message: string
    }[]
    error?: string
    createdBy: string
    createdByLabel: string
    createdAt: number
    updatedAt: number
  }
  uploadUrl?: string
}

Errors

StatusMessage
413Send files over 5 MB through the upload link.
429Too many requests to Customers this minute. Try again shortly.

POST /v1/orgs/:orgId/crm/imports/:jobId/uploaded

Marks a presigned upload complete so the import can be previewed.

Auth: user access token or platform agent key · Scope: crm:read

Path parameterDescription
:orgIdOrganization id (org_…).
:jobIdJob id: an agent job (job_…), under pipelines a pipeline job (pjb_…), or under crm an import or export (cjb_…); under marketing a list import (mkj_…).

Response 200

{
  job: {
    id: string
    kind: "import" | "export"
    object: string
    state: "queued" | "ready" | "done" | "failed" | "uploading" | "running"
    fileName: string
    fileKey: string
    size: number
    headers?: string[]
    mapping?: string[]
    options?: {
      mode: "create" | "upsert"
      ownerId?: string
      dateOrder: "iso" | "dmy" | "mdy"
    }
    view?: {
      viewId?: string
      filters?: unknown[]
      sort?: unknown
      columns?: string[]
    }
    progress: {
      rows: number
      created: number
      updated: number
      failed: number
      offset: number
    }
    errors: {
      row: number
      message: string
    }[]
    error?: string
    createdBy: string
    createdByLabel: string
    createdAt: number
    updatedAt: number
  }
}

Errors

StatusMessage
429Too many requests to Customers this minute. Try again shortly.

POST /v1/orgs/:orgId/crm/imports/:jobId/preview

The header, ten sample rows and a suggested column mapping.

Auth: user access token or platform agent key · Scope: crm:read

Path parameterDescription
:orgIdOrganization id (org_…).
:jobIdJob id: an agent job (job_…), under pipelines a pipeline job (pjb_…), or under crm an import or export (cjb_…); under marketing a list import (mkj_…).

Response 200

{
  job: {
    id: string
    kind: "import" | "export"
    object: string
    state: "queued" | "ready" | "done" | "failed" | "uploading" | "running"
    fileName: string
    fileKey: string
    size: number
    headers?: string[]
    mapping?: string[]
    options?: {
      mode: "create" | "upsert"
      ownerId?: string
      dateOrder: "iso" | "dmy" | "mdy"
    }
    view?: {
      viewId?: string
      filters?: unknown[]
      sort?: unknown
      columns?: string[]
    }
    progress: {
      rows: number
      created: number
      updated: number
      failed: number
      offset: number
    }
    errors: {
      row: number
      message: string
    }[]
    error?: string
    createdBy: string
    createdByLabel: string
    createdAt: number
    updatedAt: number
  }
  headers: string[]
  sample: string[][]
  mapping: string[]
  estimatedRows: number
}

Errors

StatusMessage
429Too many requests to Customers this minute. Try again shortly.

POST /v1/orgs/:orgId/crm/imports/:jobId/dry-run

Checks the first 1,000 rows with the mapping, writing nothing.

Auth: user access token or platform agent key · Scope: crm:read

Path parameterDescription
:orgIdOrganization id (org_…).
:jobIdJob id: an agent job (job_…), under pipelines a pipeline job (pjb_…), or under crm an import or export (cjb_…); under marketing a list import (mkj_…).

Request body

FieldTypeRequiredDefaultNotes
mappingstring[]Yesup to 500 items; each up to 60 characters
optionsobjectYes
options.mode"create" | "upsert"No"create"
options.ownerIdstringNoup to 40 characters
options.dateOrder"iso" | "dmy" | "mdy"No"dmy"

Response 200

{
  checked: number
  valid: number
  updates: number
  errors: {
    row: number
    message: string
  }[]
  complete: boolean
}

Errors

StatusMessage
429Too many requests to Customers this minute. Try again shortly.

POST /v1/orgs/:orgId/crm/imports/:jobId/start

Queues the import; follow it on the job.

Auth: user access token or platform agent key · Scopes: crm:read, crm:write

Path parameterDescription
:orgIdOrganization id (org_…).
:jobIdJob id: an agent job (job_…), under pipelines a pipeline job (pjb_…), or under crm an import or export (cjb_…); under marketing a list import (mkj_…).

Request body

FieldTypeRequiredDefaultNotes
mappingstring[]Yesup to 500 items; each up to 60 characters
optionsobjectYes
options.mode"create" | "upsert"No"create"
options.ownerIdstringNoup to 40 characters
options.dateOrder"iso" | "dmy" | "mdy"No"dmy"

Response 202

{
  job?: {
    id: string
    kind: "import" | "export"
    object: string
    state: "queued" | "ready" | "done" | "failed" | "uploading" | "running"
    fileName: string
    fileKey: string
    size: number
    headers?: string[]
    mapping?: string[]
    options?: {
      mode: "create" | "upsert"
      ownerId?: string
      dateOrder: "iso" | "dmy" | "mdy"
    }
    view?: {
      viewId?: string
      filters?: unknown[]
      sort?: unknown
      columns?: string[]
    }
    progress: {
      rows: number
      created: number
      updated: number
      failed: number
      offset: number
    }
    errors: {
      row: number
      message: string
    }[]
    error?: string
    createdBy: string
    createdByLabel: string
    createdAt: number
    updatedAt: number
  }
}

Errors

StatusMessage
429Too many requests to Customers this minute. Try again shortly.

GET /v1/orgs/:orgId/crm/meta

The caller's view of Customers: objects, pipelines, settings, the people in the org and what the caller may do.

Auth: user access token or platform agent key · Scope: crm:read

Path parameterDescription
:orgIdOrganization id (org_…).

Response 200

{
  objects: {
    id: string
    label: string
    plural: string
    prefix: string
    glyph: string
    custom?: boolean
    nameFields: string[]
    fields: {
      id: string
      label: string
      type: "number" | "text" | "email" | "url" | "date" | "owner" | "pipeline" | "phone" | "textarea" | "checkbox" | "currency" | "stage" | "lookup" | "datetime" | "percent" | "picklist" | "multipicklist" | "lookups"
      required?: boolean
      custom?: boolean
      system?: boolean
      readOnly?: boolean
      searchable?: boolean
      help?: string
      maxLength?: number
      min?: number
      max?: number
      decimals?: number
      values?: {
        value: string
        label?: string
        inactive?: boolean
      }[]
      target?: string
      convertTo?: {
        object: "contact" | "account" | "opportunity"
        field: string
      }
    }[]
    rules: {
      id: string
      name: string
      active: boolean
      when: {
        field: string
        op: "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
        value?: unknown
      }[]
      require: {
        field: string
        op: "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
        value?: unknown
      }[]
      message: string
      field?: string
    }[]
    sharing: "private" | "read" | "readwrite"
    indexes: {
      id: string
      eq: string[]
      sort: string
      status: "building" | "ready"
      builtin?: boolean
      createdAt: number
    }[]
    indexShards: number
    listColumns: string[]
    subtitleFields: string[]
    version: number
    createdAt: number
    updatedAt: number
  }[]
  pipelines: {
    id: string
    name: string
    stages: {
      id: string
      name: string
      probability: number
      category: "lost" | "open" | "won"
    }[]
    isDefault?: boolean
    order: number
    version: number
  }[]
  settings: {
    currency: string
    logEmails: boolean
    logMeetings: boolean
    roles: {
      owner: {
        viewAll: boolean | string[]
        modifyAll: boolean | string[]
      }
      admin: {
        viewAll: boolean | string[]
        modifyAll: boolean | string[]
      }
      developer: {
        viewAll: boolean | string[]
        modifyAll: boolean | string[]
      }
      viewer: {
        viewAll: boolean | string[]
        modifyAll: boolean | string[]
      }
    }
    version: number
  }
  people: {
    userId: string
    name: string
    email?: string
    role: "owner" | "admin" | "developer" | "viewer"
  }[]
  permissions: {
    write: boolean
    admin: boolean
    viewAll: string[]
    modifyAll: string[]
  }
  me: null | string
  limits: {
    bulkRecords: number
    importMb: number
    fieldsPerObject: number
    indexesPerObject: number
  }
}

Errors

StatusMessage
429Too many requests to Customers this minute. Try again shortly.

GET /v1/orgs/:orgId/crm/summary

Home: the pipeline summary (counters) and the caller's open tasks.

Auth: user access token or platform agent key · Scope: crm:read

Path parameterDescription
:orgIdOrganization id (org_…).

Response 200

{
  tasks: [] | {
    id: string
    object: string
    version: number
    ownerId: string
    name: string
    fields: {
      [key: string]: unknown
    }
    createdAt: number
    updatedAt: number
    createdBy: string
    updatedBy: string
    via: "api" | "mcp" | "calendar" | "app" | "system" | "import" | "mail" | "marketing" | "convert"
  }[]
  month: string
  pipelines: {
    pipeline: {
      id: string
      name: string
      stages: {
        id: string
        name: string
        probability: number
        category: "lost" | "open" | "won"
      }[]
      isDefault?: boolean
      order: number
      version: number
    }
    stages: {
      stage: {
        id: string
        name: string
        probability: number
        category: "lost" | "open" | "won"
      }
      total: {
        count: number
        amount: number
      }
    }[]
    open: {
      count: number
      amount: number
      weighted: number
    }
    won: {
      count: number
      amount: number
    }
    lost: {
      count: number
      amount: number
    }
    history: {
      month: string
      won: {
        count: number
        amount: number
      }
      lost: {
        count: number
        amount: number
      }
    }[]
  }[]
  records: {
    [key: string]: number
  }
}

Errors

StatusMessage
429Too many requests to Customers this minute. Try again shortly.

Records matching words, an email, a phone number or an id, that the caller can see.

Auth: user access token or platform agent key · Scope: crm:read

Path parameterDescription
:orgIdOrganization id (org_…).
Query parameterTypeRequiredDefaultNotes
qstringNo""up to 200 characters
objectsstringNoup to 400 characters
limitintegerNo201–50; coerced from a string

Response 200

{
  hits: {
    id: string
    object: string
    name: string
    subtitle: string
    ownerId: string
    score: number
  }[]
}

Errors

StatusMessage
429Too many requests to Customers this minute. Try again shortly.

GET /v1/orgs/:orgId/crm/settings

Customers settings: currency, Mail and Calendar logging, role permissions, with version.

Auth: user access token or platform agent key · Scope: crm:read

Path parameterDescription
:orgIdOrganization id (org_…).

Response 200

{
  settings: {
    currency: string
    logEmails: boolean
    logMeetings: boolean
    roles: {
      owner: {
        viewAll: boolean | string[]
        modifyAll: boolean | string[]
      }
      admin: {
        viewAll: boolean | string[]
        modifyAll: boolean | string[]
      }
      developer: {
        viewAll: boolean | string[]
        modifyAll: boolean | string[]
      }
      viewer: {
        viewAll: boolean | string[]
        modifyAll: boolean | string[]
      }
    }
    version: number
  }
}

Errors

StatusMessage
429Too many requests to Customers this minute. Try again shortly.

PATCH /v1/orgs/:orgId/crm/settings

Currency, Mail and Calendar logging, and what each role may see and change.

Auth: user access token or platform agent key · Scopes: crm:read, crm:admin

Path parameterDescription
:orgIdOrganization id (org_…).

Request body

FieldTypeRequiredNotes
versionintegerYes≥ 0
currencystringNomatches ^[A-Z]{3}$
logEmailsbooleanNo
logMeetingsbooleanNo
rolesobjectNo
roles.ownerobjectNo
roles.owner.viewAllboolean | string[]Yesup to 200 items; each up to 40 characters
roles.owner.modifyAllboolean | string[]Yesup to 200 items; each up to 40 characters
roles.adminobjectNo
roles.admin.viewAllboolean | string[]Yesup to 200 items; each up to 40 characters
roles.admin.modifyAllboolean | string[]Yesup to 200 items; each up to 40 characters
roles.developerobjectNo
roles.developer.viewAllboolean | string[]Yesup to 200 items; each up to 40 characters
roles.developer.modifyAllboolean | string[]Yesup to 200 items; each up to 40 characters
roles.viewerobjectNo
roles.viewer.viewAllboolean | string[]Yesup to 200 items; each up to 40 characters
roles.viewer.modifyAllboolean | string[]Yesup to 200 items; each up to 40 characters

Response 200

{
  settings: {
    currency: string
    logEmails: boolean
    logMeetings: boolean
    roles: {
      owner: {
        viewAll: boolean | string[]
        modifyAll: boolean | string[]
      }
      admin: {
        viewAll: boolean | string[]
        modifyAll: boolean | string[]
      }
      developer: {
        viewAll: boolean | string[]
        modifyAll: boolean | string[]
      }
      viewer: {
        viewAll: boolean | string[]
        modifyAll: boolean | string[]
      }
    }
    version: number
  }
}

Errors

StatusMessage
429Too many requests to Customers this minute. Try again shortly.