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 | Description |
|---|---|---|
Fieldsuccess |
Typeboolean | DescriptionAlways true on success |
Fielddata |
Typeobject | DescriptionThe contact field schema and the operations available for contacts. Its keys are in the rows below |
Fielddata.fields |
Typeobject | DescriptionThe contact field schema: field name → an object with type, readonly and label. Some fields also carry description and extra attributes such as nullable, multiple, maxLength and items. The standard fields are listed below, and the ufCrm* user fields of this Bitrix24 account are added to them |
Fielddata.relations |
Typeobject | DescriptionRelations with companies: company is the primary company, companyBinding covers all linked companies and the operations on them. See Contact companies |
Fielddata.activities |
Typeobject | DescriptionContact activities: the list and create operations and the call, meeting, email and task activity types. See Activities of a CRM record and Create an activity for a CRM record |
Fielddata.aggregatable |
Typearray | DescriptionStandard fields allowed in the aggregation groupBy: typeId, sourceId, assignedById |
Fielddata.batch |
Typearray | DescriptionContact write operations available in batch calls: create, update, delete |
Fielddata.import |
Typeobject | DescriptionMethod, path and maximum batch size for importing records |
Fielddata.include |
Typearray | DescriptionThe names the include parameter accepts: company, companyBinding |
Standard contact fields
| Field | Type | RO | Description |
|---|---|---|---|
Fieldid |
Typenumber | ROyes | DescriptionContact ID |
Fieldname |
Typestring | RO | DescriptionFirst name, at most 50 Unicode code points. Longer values are rejected before writing; the name is not truncated. |
FieldlastName |
Typestring | RO | DescriptionLast name |
FieldsecondName |
Typestring | RO | DescriptionMiddle name |
Fieldphone |
Typemultifield | RO | DescriptionPhone. 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 uppercase 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 by any write operation — 400 MULTIFIELD_ID_NOT_SUPPORTED, and nothing is written. The same applies to a row with id inside the raw fm[] array. |
Fieldemail |
Typemultifield | RO | DescriptionEmail. 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 uppercase 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 by any write operation — 400 MULTIFIELD_ID_NOT_SUPPORTED, and nothing is written. The same applies to a row with id inside the raw fm[] array. |
FieldphoneWork |
Typestring | ROyes | DescriptionWork phone expanded from the phone multifield. Read-only: a number is written through phone; no write operation saves a submitted value, so the 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 |
FieldphoneMobile |
Typestring | ROyes | DescriptionMobile phone expanded from the phone multifield. Read-only, like phoneWork. null when there is no such number |
FieldphoneMailing |
Typestring | ROyes | DescriptionMailing phone expanded from the phone multifield. Read-only, like phoneWork. null when there is no such number |
Fieldimol |
Typestring | ROyes | DescriptionOpen Channel (messenger) contact of the person, expanded from the multifield collection. Read-only. null when there is none |
Fieldaddress |
Typestring | ROyes | DescriptionAddress of the contact as a single line (legacy column). Bitrix24 returns it but does not store it through the item API used by this method: no write operation saves a submitted value, 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 |
FieldshortName |
Typestring | ROyes | DescriptionShort name — last name with initials ("Smith J. R."), computed by Bitrix24. Returned only in list or search results when the field is explicitly named in select (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 (the same error codes as for phoneWork). Filter (exact and $contains) and sorting work |
FieldhasPhone |
Typeboolean | ROyes | DescriptionWhether a phone is set |
FieldhasEmail |
Typeboolean | ROyes | DescriptionWhether an email is set |
FieldhasImol |
Typeboolean | ROyes | DescriptionWhether there is an Open Channel contact |
FieldcompanyId |
Typenumber | RO | DescriptionCompany ID. Lookup: GET /v1/companies |
Fieldpost |
Typestring | RO | DescriptionPosition |
Fieldcomments |
Typestring | RO | DescriptionComment |
FieldtypeId |
Typestring | RO | DescriptionContact type. List: GET /v1/statuses?filter[entityId]=CONTACT_TYPE |
FieldsourceId |
Typestring | RO | DescriptionSource. List: GET /v1/statuses?filter[entityId]=SOURCE |
FieldsourceDescription |
Typestring | RO | DescriptionSource description |
FieldassignedById |
Typenumber | RO | DescriptionAssignee. List: GET /v1/users |
FieldcreatedBy |
Typenumber | ROyes | DescriptionCreator. Lookup: GET /v1/users |
FieldupdatedBy |
Typenumber | ROyes | DescriptionModified by. Lookup: GET /v1/users |
FieldcreatedTime |
Typedatetime | ROyes | DescriptionCreation date |
FieldupdatedTime |
Typedatetime | ROyes | DescriptionModification date |
Fieldopened |
Typeboolean | RO | DescriptionAvailable to everyone |
Fieldexport |
Typeboolean | RO | DescriptionExport allowed |
FieldleadId |
Typenumber | RO | DescriptionSource lead ID |
Fieldhonorific |
Typestring | RO | DescriptionSalutation. 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. For details, see Value format by type.
Response example
{
"success": true,
"data": {
"fields": {
"id": { "type": "number", "readonly": true, "label": "ID", "description": "Contact identifier." },
"name": { "type": "string", "readonly": false, "maxLength": 50, "label": "First name", "description": "Contact's first name, up to 50 characters. A longer value is refused before writing instead of being silently shortened." },
"assignedById": { "type": "number", "readonly": false, "label": "Responsible person", "description": "User responsible for the contact." }
},
"relations": {
"company": { "type": "one", "entity": "companies", "includable": true },
"companyBinding": { "type": "many", "entity": "companies", "operations": ["list", "add", "remove", "set", "clear"] }
},
"activities": { "operations": ["list", "create"], "types": ["call", "meeting", "email", "task"] },
"aggregatable": ["typeId", "sourceId", "assignedById"],
"batch": ["create", "update", "delete"],
"import": { "method": "POST", "path": "/v1/contacts/import", "maxItems": 100 },
"include": ["company", "companyBinding"]
}
}
Three fields from data.fields are shown, along with the other data keys. The full set of fields is in the tables above.
What to do with the names from data.include is covered on the Get contact page. For more information about the include parameter, see Related data.
Error response example
403 — the key lacks the crm scope:
{
"success": false,
"error": {
"code": "SCOPE_DENIED",
"message": "This endpoint requires 'crm' scope",
"hint": "This request needs the 'crm' scope, which the calling key does not carry. Add 'crm' to this key in the developer cabinet (or through the management API), then repeat the call.",
"cause": "key_scope_missing",
"requiredScope": "crm",
"keyScopes": ["task", "im"],
"fix": { "action": "edit_key_scopes", "via": "cabinet" },
"userMessage": "The app's API key lacks the “CRM” permission. You can add it in the key settings in the developer cabinet."
}
}
Errors
| HTTP | Code | Description |
|---|---|---|
| HTTP403 | CodeSCOPE_DENIED |
DescriptionAPI key lacks the crm scope |
| HTTP401 | CodeTOKEN_MISSING |
DescriptionAPI key has no configured tokens |
| HTTP429 | CodeRATE_LIMITED |
DescriptionRate limit exceeded: 300 requests per minute per portal. All API keys of the portal share one limit. The current limit is returned in the x-ratelimit-limit header. Retry after the delay in the Retry-After header |
For the full list of common API errors, see Errors.