For AI agents: markdown of this page — /docs-content-en/entities/contacts/fields.md documentation index — /llms.txt
Contact fields
GET /v1/contacts/fields
Returns the full list of available fields, including user fields (ufCrm*).
Examples
curl — personal key
curl "https://vibecode.bitrix24.com/v1/contacts/fields" \
-H "X-Api-Key: YOUR_API_KEY"
curl — OAuth application
curl "https://vibecode.bitrix24.com/v1/contacts/fields" \
-H "X-Api-Key: YOUR_APP_KEY" \
-H "Authorization: Bearer USER_SESSION_TOKEN"
JavaScript — personal key
const res = await fetch('https://vibecode.bitrix24.com/v1/contacts/fields', {
headers: {
'X-Api-Key': 'YOUR_API_KEY',
},
})
const { success, data } = await res.json()
console.log('Fields:', Object.keys(data.fields).length)
JavaScript — OAuth application
const res = await fetch('https://vibecode.bitrix24.com/v1/contacts/fields', {
headers: {
'X-Api-Key': 'YOUR_APP_KEY',
'Authorization': 'Bearer USER_SESSION_TOKEN',
},
})
const { success, data } = await res.json()
Response fields
The label and description field captions are returned in English, while the ones the platform takes straight from the Bitrix24 account come in the account language. Request headers do not switch the language.
| Field | Type | RO | Description |
|---|---|---|---|
id |
number | yes | Contact ID |
name |
string | First name | |
lastName |
string | Last name | |
secondName |
string | Middle name | |
phone |
multifield | Phone. On input (POST/PATCH) accepts string | string[] | object[]. On output phone is a string with the primary value, per-type values are in phoneWork/phoneMobile, and the full list with types is in the fm[] array (format { id, typeId, valueType, value }). Important: PATCH only adds new records — old phone entries are not removed. See Update contact. Important: The UPPER form [{ "VALUE": "...", "VALUE_TYPE": "WORK" }] is not accepted — it returns 400 INVALID_MULTIFIELD_SHAPE. Use camelCase: [{ "value": "...", "typeId": "WORK" }]. An object with an id field is not accepted on any write door — 400 MULTIFIELD_ID_NOT_SUPPORTED, and nothing is written. The same applies to a row with id inside the raw fm[] array. |
|
email |
multifield | Email. On input accepts string | string[] | object[]. On output email is a string with the primary value, per-type values are in emailWork/emailHome/emailMailing, and the full list is in the fm[] array. Important: PATCH only adds new records — old email entries are not removed. Important: The UPPER form [{ "VALUE": "...", "VALUE_TYPE": "WORK" }] is not accepted — it returns 400 INVALID_MULTIFIELD_SHAPE. Use camelCase: [{ "value": "...", "typeId": "WORK" }]. An object with an id field is not accepted on any write door — 400 MULTIFIELD_ID_NOT_SUPPORTED, and nothing is written. The same applies to a row with id inside the raw fm[] array. |
|
phoneWork |
string | yes | Work phone expanded from the phone multifield. Read-only: a number is written through phone; a sent value is stored on no door, so a write is rejected: create and update — 400 READONLY_FIELD, import — 400 IMPORT_ITEM_VALIDATION, entity batch — 400 BATCH_ITEM_VALIDATION, global batch — READONLY_FIELD under the call. null when there is no such number. Filter (exact and $contains) and sorting work |
phoneMobile |
string | yes | Mobile phone expanded from the phone multifield. Read-only, like phoneWork. null when there is no such number |
phoneMailing |
string | yes | Mailing phone expanded from the phone multifield. Read-only, like phoneWork. null when there is no such number |
imol |
string | yes | Open Channel (messenger) contact of the person, expanded from the multifield collection. Read-only. null when there is none |
address |
string | yes | Address of the contact as a single line (legacy column). Bitrix24 returns it but does not store it through the item API this method writes with: a sent value is stored on no write door and the request is rejected (codes as for phoneWork); only the legacy crm.contact.add of older integrations fills it, and an address is edited in the contact's requisites. null when not filled in. Filter (exact and $contains) and sorting work |
shortName |
string | yes | Short name — last name with initials ("Smith J. R."), computed by Bitrix24. Comes only in a list or search whose select names the field explicitly (without *); a single GET /v1/contacts/{id}, a list without select and the entity batch list (its select is a projection) return null. Read-only (refusal codes as for phoneWork). Filter (exact and $contains) and sorting work |
hasPhone |
boolean | yes | Whether a phone is set |
hasEmail |
boolean | yes | Whether an email is set |
hasImol |
boolean | yes | Whether there is an Open Channel contact |
companyId |
number | Company ID. Lookup: GET /v1/companies |
|
post |
string | Position | |
comments |
string | Comment | |
typeId |
string | Contact type. List: GET /v1/statuses?filter[entityId]=CONTACT_TYPE |
|
sourceId |
string | Source. List: GET /v1/statuses?filter[entityId]=SOURCE |
|
sourceDescription |
string | Source description | |
assignedById |
number | Assignee. List: GET /v1/users |
|
createdBy |
number | yes | Creator. Lookup: GET /v1/users |
updatedBy |
number | yes | Modified by. Lookup: GET /v1/users |
createdTime |
datetime | yes | Creation date |
updatedTime |
datetime | yes | Modification date |
opened |
boolean | Available to everyone | |
export |
boolean | Export allowed | |
leadId |
number | Source lead ID | |
honorific |
string | Salutation. List: GET /v1/statuses?filter[entityId]=HONORIFIC |
User fields (ufCrm*) are also returned in responses and accepted on create/update. For an enumeration field, this endpoint returns an array of options at data.fields.<field name>.items, shaped as { "ID": "3989", "VALUE": "warm" }. To write to a user field, send the ID, while VALUE is the option label for display. A label sent instead of the identifier is lost without an error. Details — Value format by type.
Available includes
The GET /v1/contacts/fields endpoint returns a list of available includes: company.
Usage example: Get contact.
More about includes: Related data.
Response example
{
"success": true,
"data": {
"fields": {
"id": { "type": "number", "readonly": true },
"name": { "type": "string", "readonly": false },
"assignedById": { "type": "number", "readonly": false }
},
"batch": ["create", "update", "delete"]
}
}
Only 3 of the many fields are shown. The full list is in the table above.
Errors
| HTTP | Code | Description |
|---|---|---|
| 403 | SCOPE_DENIED |
API key lacks the crm scope |
| 401 | TOKEN_MISSING |
API key has no configured tokens |
| 429 | RATE_LIMITED |
Rate limit exceeded: 300 requests per minute per portal, all API keys of the portal share one limit. The exact value arrives in the x-ratelimit-limit header (the cap is divided across replicas). Retry after the delay in the Retry-After header |
Full list of common API errors — Errors.