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 application
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 application
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 |
isWon |
isWon |
boolean | yes | Whether the deal is in a won stage (stageSemanticId = S). Computed by Bitrix24; comes only in a list or search with an explicit select (see below). Not accepted in filter — 400 UNKNOWN_FILTER_FIELD, filter on stageSemanticId instead; sorting works |
isLose |
isLose |
boolean | yes | Whether the deal is in a lost stage (stageSemanticId = F). Like isWon: explicit select only, not accepted in filter, sorting works |
isWork |
isWork |
boolean | yes | Whether the deal is in an in-progress stage (stageSemanticId = P). Like isWon: explicit select only, not accepted in filter, sorting works |
hasProducts |
hasProducts |
boolean | yes | Whether the deal has at least one product row (GET /v1/deals/{id}/products). Explicit select only, like isWon. Not accepted in filter (400 UNKNOWN_FILTER_FIELD): Bitrix24 matches the flag only against a boolean value, the Y/N form matches no record, and there is no substitute filter — read select=hasProducts or the product rows; sorting works |
receivedAmount |
receivedAmount |
number | yes | Amount counted as received, in the account's accounting currency: while the deal is in a won stage it equals amount converted at the account's currency rate (same as amount when currency is the accounting currency), 0 otherwise. Computed by Bitrix24; comes only in an explicit select (see below). Filter (including $gt/$lt) and sorting work |
lostAmount |
lostAmount |
number | yes | Amount counted as lost, in the account's accounting currency: while the deal is in a lost stage it equals amount converted at the account's currency rate, 0 otherwise. Like receivedAmount: explicit select only, filter and sorting work |
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 | yes | Tax amount on the deal, in the deal currency. Arrives as 0 when no tax applies. Computed by Bitrix24 from the product rows and accepted on no write door. Measured 2026-09-11 on live Bitrix24 accounts of both platforms: create and update in both amount modes, import in both modes — the read-back is 0 every time. Therefore declared read-only: a write is refused instead of answering success and dropping the value. Set the tax through the product rows |
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 six computed fields — isWon, isLose, isWork, hasProducts, receivedAmount, lostAmount — are calculated by Bitrix24 only for a list, a search or the list action of the global batch POST /v1/batch whose select names the field explicitly and without * (GET /v1/deals?select=id,isWon,receivedAmount, POST /v1/deals/search with select). A single GET /v1/deals/{id}, a list without select and the list action of the entity batch (its select is a projection, not forwarded to Bitrix24) return null for them — that is «not requested», not «empty». All six are read-only: a sent value 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). The four flags are not accepted in filter (400 UNKNOWN_FILTER_FIELD): a boolean filter travels to Bitrix24 as Y/N, while Bitrix24 matches these flags only against a boolean value — for the three stage flags the string Y answers the inverted set, for hasProducts it matches no record; filter on stageSemanticId for the stage, there is no substitute for the products. Sorting by all six works; receivedAmount and lostAmount are also accepted in sum/avg/min/max of POST /v1/deals/aggregate — the result is in the account's accounting currency, unlike sum(amount), which adds deal amounts in their own currencies as they are.
The UTM fields (utmSource, utmMedium, utmCampaign, utmContent, utmTerm) 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. For an enumeration field, this endpoint returns an array of options at data.fields.<field name>.items, shaped as { "ID": "3983", "VALUE": "warm" }. This is not the enum key of declared fields with value and label elements: 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/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 account 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.