Skip to main content
PATCH
Update a contact field (public API)
Changes one of your own contact fields. A partial update: only what you send changes.

Overview

Everything about a field is editable except its key. Relabel it, retype it, add CSV aliases, switch it in or out of the agent’s contact summary, reorder it.

The key is not editable

There is no key property on this request. Sending one is a 400 naming it, rather than a silent no-op. The reason is that a key is the identity of two things that cannot be migrated in the same step: every {{contact.<key>}} token already saved inside an agent’s flow, and every value already stored under that key on your contacts. A rename would blank the first and orphan the second. To change a key, create a new field, copy the values across, update your agents, then delete the old one.

Seeded fields cannot be edited

A field with isSystem: true belongs to the platform — editing it would change what {{contact.first_name}} means for every company. PATCH on one is a 403. To change a seeded field’s label or type for your company alone, define your own field with the same key: it shadows the seeded one and comes back with isCompanyOverride: true.

Changing a type

Changing dataType changes how future writes are validated. It does not re-validate or convert values already stored — those keep whatever they were written as. If you are tightening a field (say string to enum), read the existing values first. Moving away from enum clears enumOptions automatically, so a field cannot keep a stale option list that validation would then enforce against a string. tags is worth calling out for the same reason: switching a string field to tags leaves every stored value a plain string until it is next written, so a reader has to handle both until then. Writing "a, b" to it once turns that contact’s value into ["a","b"].

Scopes

write:contacts (or its write:candidates alias).

Error Scenarios

  • 400 Bad Request: a key property; an enum left with no options
  • 403 Forbidden: a seeded field; or the key lacks write:contacts
  • 404 Not Found: no such field in your company’s catalog

List Contact Fields

Find the field’s id

Create Contact Field

Define a new field

Authorizations

Authorization
string
header
required

API key for authentication using Bearer scheme

Path Parameters

id
string
required

Query Parameters

companyId
string

Required for ATS API keys to specify which company to access. Ignored for standard company API keys.

Body

application/json
label
string

Human label

Example:

"Order reference"

dataType
enum<string>

The value type. Changing it does not re-validate values already stored — those keep whatever they were written as. tags stores a string[] and accepts either an array or a comma-separated string, so one CSV cell maps onto one field.

Available options:
string,
number,
date,
bool,
enum,
tags
enumOptions
string[]

The allowed values. Cleared automatically when the type moves away from ENUM.

isPii
boolean

Mark the field as personal data. Personal data. Masked in logs, and EXCLUDED from everything that reaches the agent — the prompt and the generated contact document alike — unless allowPiiInContext is set on this field, or the platform lists it in the essential prompt set (inEssentialPromptSet).

csvAliases
string[]

Extra CSV header names this field should also match Stored for the contact-field importer, which has not shipped: setting this changes no import behaviour today.

allowPiiInContext
boolean

Let this one personal field reach the agent anyway. It joins the generated contact document AND the prompt, because a queryable value is one the agent might never think to look up, and reliability is the point for a field like an outstanding balance. Only meaningful when isPii is true; sending it on a field that is not personal data is rejected rather than ignored.

Example:

false

description
string

What the field means

Maximum string length: 300
displayOrder
number

Ascending display order; ties break on key

Response

id
string<uuid>
required

Field id. Needed only to address PATCH and DELETE; every other surface uses key.

Example:

"123e4567-e89b-12d3-a456-426614174000"

key
string
required

The key you address this field by, in {{contact.<key>}} and in a values payload

Example:

"order_number"

label
string
required

Human label, shown wherever the field is offered for editing

Example:

"Order number"

dataType
enum<string>
required

The value type this field accepts. Writes are validated against it. tags is a string[] and accepts either an array or a comma-separated string, so one CSV cell maps onto one field.

Available options:
string,
number,
date,
bool,
enum,
tags
Example:

"string"

category
enum<string>
required

Which panel of the catalog this field belongs to — the grouping the dashboard's variable palette uses, and the first key this list is ordered by. Set by InstaView and not writable: a field you define is always custom, and a field of yours that shadows a seeded one reports the seeded field's category so the grouping is the same for every company.

Available options:
identity,
organisation,
commercial,
relationship,
scheduling,
recruiting,
platform,
custom
Example:

"commercial"

isPii
boolean
required

Personal data. Masked in logs, and EXCLUDED from everything that reaches the agent — the prompt and the generated contact document alike — unless allowPiiInContext is set on this field, or the platform lists it in the essential prompt set (inEssentialPromptSet).

Example:

false

isSystem
boolean
required

A field the platform defines and every company shares. A seeded field cannot be edited or deleted directly; for most of them you can define your own field with the same key to override the label and type for your company alone. Eight keys are RESERVED and refuse even that (first_name, last_name, email, phone, company_name, company_description, agent_name, profile), because the platform resolves them itself.

Example:

false

allowPiiInContext
boolean
required

Let this one personal field reach the agent anyway. It joins the generated contact document AND the prompt, because a queryable value is one the agent might never think to look up, and reliability is the point for a field like an outstanding balance. Only meaningful when isPii is true; sending it on a field that is not personal data is rejected rather than ignored.

Example:

false

inEssentialPromptSet
boolean
required

Read-only. Whether the platform puts this field in every context-enabled agent's prompt: a short set covering what an agent needs to open a call correctly. Not settable — everything else the contact has reaches the agent through the generated contact document instead, which is queried mid-call rather than paid for on every dial.

Example:

false

displayOrder
number
required

Ascending display order; ties break on key

Example:

50

isCompanyOverride
boolean
required

True when this is your own field overriding a seeded field of the same key

Example:

false

readOnly
boolean
required

Catalogued so an agent author can use the token, but resolved by the platform on every call rather than stored per contact (company_description is your company's own blurb, not the contact's data). Sending a value for one is a 422. Note this is not the whole of what you can write — check writable for that.

Example:

false

writable
boolean
required

Whether fields on POST /contacts or PATCH /contacts/{id} accepts a value for this key. The one flag to branch on before writing: readOnly alone is not enough, because a key the platform RESERVES (email, first_name, phone and the rest of the identity fields) reports readOnly: false and is still refused with a 422 — those are writable, but through the contact resource's own properties rather than as a field. False also for every read-only key, so a false here always means "do not send a value for this".

Example:

true

enumOptions
string[]

The allowed values, for an ENUM field. Absent for every other type.

Example:
csvAliases
string[]

Extra CSV header names this field also matches during an import Stored for the contact-field importer, which has not shipped: setting this changes no import behaviour today.

Example:
description
string

What the field means

Example:

"The order this call is about"