For AI agents: markdown of this page — /docs-content-en/entities/deals/fields.md documentation index — /llms.txt
Deal fields
GET /v1/deals/fields
Returns the full list of available fields, including user fields (ufCrm_*).
Examples
curl — personal key
curl "https://vibecode.bitrix24.com/v1/deals/fields" \
-H "X-Api-Key: YOUR_API_KEY"
curl — OAuth app
curl "https://vibecode.bitrix24.com/v1/deals/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/deals/fields', {
headers: {
'X-Api-Key': 'YOUR_API_KEY',
},
})
const { success, data } = await res.json()
console.log('Fields:', Object.keys(data.fields).length)
JavaScript — OAuth app
const res = await fetch('https://vibecode.bitrix24.com/v1/deals/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. Enum values carry an English label.
| Field | Bitrix24 | Type | RO | Description |
|---|---|---|---|---|
id |
id |
number | yes | Deal ID |
title |
title |
string | Title | |
amount |
opportunity |
number | Amount | |
currency |
currencyId |
string | Currency. List: GET /v1/currencies |
|
stageId |
stageId |
string | Pipeline stage. The set of stages and their identifiers are configured in your Bitrix24 account and differ between pipelines. Current list — GET /v1/statuses?filter[entityId]=DEAL_STAGE for the main pipeline, GET /v1/statuses?filter[entityId]=DEAL_STAGE_{N} for the pipeline with categoryId={N} (the categoryId value is taken from GET /v1/deal-categories) |
|
categoryId |
categoryId |
number | Pipeline ID (0 = main). List: GET /v1/deal-categories |
|
stageSemanticId |
stageSemanticId |
string | yes | Semantic category of the current stage: P — in progress, S — success, F — failure |
companyId |
companyId |
number | Company ID. Search: GET /v1/companies |
|
contactId |
contactId |
number | Primary contact ID. Search: GET /v1/contacts |
|
contactIds |
contactIds |
number[] | yes | All linked contacts. Search: GET /v1/contacts |
assignedById |
assignedById |
number | Assignee. List: GET /v1/users |
|
createdBy |
createdBy |
number | yes | Creator. Search: GET /v1/users |
updatedBy |
updatedBy |
number | yes | Modified by. Search: GET /v1/users |
createdAt |
createdTime |
datetime | yes | Creation date |
updatedAt |
updatedTime |
datetime | yes | Modification date |
closedAt |
closedate |
datetime | Closing date | |
closed |
closed |
boolean | yes | Whether the deal is closed |
sourceId |
sourceId |
string | Source. List: GET /v1/statuses?filter[entityId]=SOURCE |
|
sourceDescription |
sourceDescription |
string | Source description | |
probability |
probability |
number | Probability of success (%) | |
opened |
opened |
boolean | Available to everyone | |
comments |
comments |
string | Comment | |
observers |
observers |
number[] | Observers. List: GET /v1/users |
|
typeId |
typeId |
string | Record type. List: GET /v1/statuses?filter[entityId]=DEAL_TYPE |
|
isReturning |
isReturnCustomer |
boolean | Repeat deal | |
leadId |
leadId |
number | Lead the deal was created from. Arrives as null when the deal was not converted from a lead. Lookup: GET /v1/leads |
|
quoteId |
quoteId |
number | Quote the deal was created from. Arrives as null when the deal was not created from one. Lookup: GET /v1/quotes |
|
taxValue |
taxValue |
number | Tax amount on the deal, in the deal currency. Arrives as 0 when no tax applies. Measured 2026-09-07 on a live portal: a value sent here is not stored in either amount mode — automatic or manual — on create or on update; the read-back is 0. The import path has not been measured, so the field is left writable |
|
originId |
originId |
string | Identifier of this deal in the external system it was imported from. Arrives as null for deals created in Bitrix24 |
|
originatorId |
originatorId |
string | External system the deal was imported from. Arrives as null for deals created in Bitrix24 |
|
additionalInfo |
additionalInfo |
string | Free-form additional information on the deal. Arrives as null when unset |
|
lastActivityBy |
lastActivityBy |
number | User who performed the last timeline activity on the deal. Arrives as 0 when there was none. Lookup: GET /v1/users |
The seven fields above — leadId, quoteId, taxValue, originId, originatorId, additionalInfo and lastActivityBy — are accepted in filter and in sorting, including in GET /v1/deals, POST /v1/deals/search and POST /v1/deals/aggregate. Five of them (leadId, quoteId, originId, originatorId, additionalInfo) may arrive as null, and for the three string fields an empty string from Bitrix24 is normalized to null — compare against an empty value, not against "".
The UTM fields (utmSource, utmMedium, utmCampaign, utmContent, utmTerm) and contacts are returned on reads but accepted neither in filter nor in sorting. Such a request is rejected with 400 UNKNOWN_FILTER_FIELD or 400 UNKNOWN_SORT_FIELD before Bitrix24 is called, and the reason for each field arrives in its description in this same endpoint's response. For contacts, filter by contactId (the primary contact) or by contactIds (any linked contact).
User fields (ufCrm_*) are also returned in responses and accepted on create/update.
Available includes
The GET /v1/deals/fields endpoint returns the list of available includes: contact, company.
Usage example: Get deals.
More on includes: Related data.
Response example
{
"success": true,
"data": {
"fields": {
"id": { "type": "number", "readonly": true, "label": "ID", "description": "Unique numeric identifier of the deal." },
"title": { "type": "string", "readonly": false, "label": "Title", "description": "Deal title." },
"assignedById": { "type": "number", "readonly": false, "label": "Assignee", "description": "ID of the responsible user. List: GET /v1/users." },
"stageSemanticId": { "type": "string", "readonly": true, "label": "Stage semantics", "description": "Semantic category of the current stage — codes are decoded in enum.", "enum": [{ "value": "P", "label": "In progress" }, { "value": "S", "label": "Success" }, { "value": "F", "label": "Failure" }] }
},
"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.