For AI agents: markdown of this page — /docs-content-en/entities/quotes/fields.md documentation index — /llms.txt
Quote fields
GET /v1/quotes/fields
Returns the full list of available fields, including user fields (ufCrm_*).
Examples
curl — personal key
curl "https://vibecode.bitrix24.com/v1/quotes/fields" \
-H "X-Api-Key: YOUR_API_KEY"
curl — OAuth application
curl "https://vibecode.bitrix24.com/v1/quotes/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/quotes/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/quotes/fields', {
headers: {
'X-Api-Key': 'YOUR_APP_KEY',
'Authorization': 'Bearer USER_SESSION_TOKEN',
},
})
const { success, data } = await res.json()
Response fields
| Field | Bitrix24 | Type | RO | Description |
|---|---|---|---|---|
id |
id |
number | yes | Quote ID |
quoteNumber |
quoteNumber |
string | Quote number | |
title |
title |
string | Name | |
amount |
opportunity |
number | Amount | |
taxValue |
taxValue |
number | yes | Tax amount for the quote. 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 |
currency |
currencyId |
string | Currency. List: GET /v1/currencies |
|
stageId |
stageId |
string | Status: DRAFT, SENT, APPROVED. List: GET /v1/statuses?filter[entityId]=QUOTE_STATUS |
|
isManualOpportunity |
isManualOpportunity |
boolean | Manual amount mode (Y/N in Bitrix24, converted to boolean) |
|
opened |
opened |
boolean | Available to everyone | |
closed |
closed |
boolean | yes | Quote is closed |
dealId |
dealId |
number | Deal ID. Lookup: GET /v1/deals |
|
leadId |
leadId |
number | Lead ID. Lookup: GET /v1/leads |
|
contactId |
contactId |
number | Contact ID. Lookup: GET /v1/contacts |
|
contactIds |
contactIds |
array | Quote contact IDs. Send the full list — the binding set is replaced, not merged | |
contacts |
contacts |
array | yes | Not returned: the Bitrix24 item API never returns this key for quotes, and quotes have no bindings route — the bound contacts are in contactIds. Declared so that a write is refused (400 READONLY_FIELD instead of a raw Bitrix24 error); in select it answers 400 SELECT_FIELD_NOT_RETURNED, and it is not accepted in filter or order — 400 UNKNOWN_FILTER_FIELD / 400 UNKNOWN_SORT_FIELD |
clientTitle |
clientTitle |
string | yes | Client name from the legacy snapshot. The seven client* fields (name, address, contact person, e-mail, phone, taxpayer ID, tax registration code) are not filled by binding a company and a contact and are not accepted by the item API — a value sent on create, update, batch or import is dropped by Bitrix24. The legacy crm.quote.add / crm.quote.update methods (the ones older integrations use) store them, so they are returned in reads, work in filter and sort, and are declared read-only. A write is refused instead of answering success and dropping the value: 400 READONLY_FIELD; BATCH_ITEM_VALIDATION in batch, IMPORT_ITEM_VALIDATION in import. null when nothing was stored, like every other string field. Measured 2026-09-15/16 through the direct webhook on a Bitrix24 test account |
clientAddr |
clientAddr |
string | yes | Client address from the legacy snapshot — filled and read the same way as clientTitle |
clientContact |
clientContact |
string | yes | Client contact person from the legacy snapshot — as clientTitle |
clientEmail |
clientEmail |
string | yes | Client e-mail from the legacy snapshot — as clientTitle |
clientPhone |
clientPhone |
string | yes | Client phone from the legacy snapshot — as clientTitle |
clientTpId |
clientTpId |
string | yes | Client taxpayer ID (INN) from the legacy snapshot — as clientTitle |
clientTpaId |
clientTpaId |
string | yes | Client tax registration code (KPP) from the legacy snapshot — as clientTitle |
companyId |
companyId |
number | Company ID. Lookup: GET /v1/companies |
|
mycompanyId |
mycompanyId |
number | Your company details | |
personTypeId |
personTypeId |
number | yes | Payer type |
assignedById |
assignedById |
number | Assignee. List: GET /v1/users |
|
createdBy |
createdBy |
number | yes | Creator. Lookup: GET /v1/users |
updatedBy |
updatedBy |
number | yes | Updated by |
lastActivityBy |
lastActivityBy |
number | Last activity author | |
comments |
comments |
string | Comment | |
content |
content |
string | Content | |
terms |
terms |
string | Terms | |
locationId |
locationId |
string | Location | |
webformId |
webformId |
number | Created by a CRM web form | |
storageTypeId |
storageTypeId |
number | File storage type | |
storageElementIds |
storageElementIds |
array | Storage file IDs | |
utmSource |
utmSource |
string | UTM source | |
utmMedium |
utmMedium |
string | UTM medium | |
utmCampaign |
utmCampaign |
string | UTM campaign | |
utmContent |
utmContent |
string | UTM content | |
utmTerm |
utmTerm |
string | UTM term | |
beginDate |
begindate |
datetime | Start date | |
closeDate |
closedate |
datetime | Close date | |
actualDate |
actualDate |
datetime | Valid until | |
lastActivityTime |
lastActivityTime |
datetime | Last activity | |
lastCommunicationTime |
lastCommunicationTime |
string | yes | Last communication date |
lastCommunicationCallTime |
lastCommunicationCallTime |
datetime | yes | Last call date |
lastCommunicationEmailTime |
lastCommunicationEmailTime |
datetime | yes | Last email date |
lastCommunicationImolTime |
lastCommunicationImolTime |
datetime | yes | Last Open Channels dialog date |
lastCommunicationWebformTime |
lastCommunicationWebformTime |
datetime | yes | Last CRM web-form submission date |
createdTime |
createdTime |
datetime | yes | Creation date |
updatedTime |
updatedTime |
datetime | yes | Modification date |
The UTM fields are returned in list/get but accepted neither in filter nor in sorting. A request with filter[utmSource] returns 400 UNKNOWN_FILTER_FIELD, one with sort=utmSource returns 400 UNKNOWN_SORT_FIELD, and both refusals arrive before Bitrix24 is called.
User fields (ufCrm_*) are also returned in responses and accepted on create/update.
Available includes
The GET /v1/quotes/fields endpoint returns the list of available includes: deal, contact, company.
Usage example: Get quotes.
More about includes: Related data.
Response example
{
"success": true,
"data": {
"fields": {
"id": {
"type": "number",
"readonly": true,
"label": "Quote ID",
"description": "Quote identifier assigned by Bitrix24."
},
"title": {
"type": "string",
"readonly": false,
"label": "Name",
"description": "Quote name shown in the list and in the card."
},
"assignedById": {
"type": "number",
"readonly": false,
"label": "Assignee",
"description": "Employee responsible for the quote. Available values: GET /v1/users."
}
},
"batch": ["create", "update", "delete"]
}
}
Only 3 of the many fields are shown. The full list is in the table above.
Every field is described by an object { type, readonly, label, description }. label is a short caption in English, while labels that the platform takes straight from the Bitrix24 account come in the account language. description is an extended explanation: what the field is for, where to get the list of allowed values, and how it behaves on write. Request headers do not switch the language. The stageId value set is configured in your Bitrix24 account, so its description links to the status list endpoint instead of enumerating fixed values.
Errors
| HTTP | Code | Description |
|---|---|---|
| 403 | SCOPE_DENIED |
The API key lacks the crm scope |
| 401 | TOKEN_MISSING |
The 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.