For AI agents: markdown of this page — /docs-content-en/entities/products/fields.md documentation index — /llms.txt
CRM product fields
GET /v1/products/fields
Returns the product field schema: 22 standard fields and the custom catalog properties of the form PROPERTY_<N> configured in the Bitrix24 account. Every field carries a label, a type, and a read-only flag. Fields that need further explanation also carry a description, and fields with a fixed value set carry an enum dictionary.
Standard fields
Each field is described by an object { type, readonly }. The writeOnly: true marker identifies a write-only name, while notReturned: true identifies a name absent from responses. The list, get, search, create, and update responses use canonical camelCase names. currencyId is a write alias: response data carries the currency under currency. If both names are present, currency wins. An explicit select=currencyId is rejected with 400 SELECT_FIELD_NOT_RETURNED. Use select=currency for reads. The native Bitrix24 name select=CURRENCY_ID remains valid and also returns the value under the canonical currency key.
| Field | Bitrix24 | Type | RO | Description |
|---|---|---|---|---|
Fieldid |
Bitrix24ID |
Typenumber | ROyes | DescriptionProduct identifier |
Fieldname |
Bitrix24NAME |
Typestring | RO | DescriptionProduct name |
Fieldactive |
Bitrix24ACTIVE |
Typeboolean | RO | DescriptionWhether the product is active |
Fieldprice |
Bitrix24PRICE |
Typenumber | RO | DescriptionProduct price |
FieldcurrencyId |
Bitrix24CURRENCY_ID |
Typestring | RO | DescriptionWrite alias of currency. Marked writeOnly: true and notReturned: true |
Fieldcurrency |
Bitrix24CURRENCY_ID |
Typestring | RO | DescriptionCanonical name of the price currency. If both names are present, currency wins. List: GET /v1/currencies |
FieldsectionId |
Bitrix24SECTION_ID |
Typenumber | RO | DescriptionCatalog section. List: GET /v1/product-sections |
FieldcatalogId |
Bitrix24CATALOG_ID |
Typenumber | RO | DescriptionCatalog identifier. List: GET /v1/catalogs |
Fieldmeasure |
Bitrix24MEASURE |
Typenumber | RO | DescriptionMeasurement unit identifier |
Fielddescription |
Bitrix24DESCRIPTION |
Typestring | RO | DescriptionProduct description |
FielddescriptionType |
Bitrix24DESCRIPTION_TYPE |
Typestring | RO | DescriptionDescription format — text or html |
Fieldsort |
Bitrix24SORT |
Typenumber | RO | DescriptionSort order. A lower value places the product higher |
Fieldcode |
Bitrix24CODE |
Typestring | RO | DescriptionSymbolic product code |
FieldxmlId |
Bitrix24XML_ID |
Typestring | RO | DescriptionExternal identifier for synchronization |
FieldvatId |
Bitrix24VAT_ID |
Typenumber | RO | DescriptionVAT rate identifier |
FieldvatIncluded |
Bitrix24VAT_INCLUDED |
Typeboolean | RO | DescriptionWhether VAT is included in the price |
FieldpreviewPicture |
Bitrix24PREVIEW_PICTURE |
Typeobject | ROyes | DescriptionImage for the list |
FielddetailPicture |
Bitrix24DETAIL_PICTURE |
Typeobject | ROyes | DescriptionImage for the card |
FieldcreatedBy |
Bitrix24CREATED_BY |
Typenumber | ROyes | DescriptionCreator identifier. List: GET /v1/users |
FieldmodifyBy |
Bitrix24MODIFIED_BY |
Typenumber | ROyes | DescriptionIdentifier of the last editor. List: GET /v1/users |
FieldcreatedAt |
Bitrix24DATE_CREATE |
Typedatetime | ROyes | DescriptionCreation date |
FieldupdatedAt |
Bitrix24TIMESTAMP_X |
Typedatetime | ROyes | DescriptionLast modification date |
Custom properties
Catalog properties come back as additional keys of the form PROPERTY_<N> with the type product_property. Each is described by an object { type, readonly, label }, where label is the property name in the Bitrix24 account language. The property set depends on the catalog settings: one Bitrix24 account may return "SKU", "Manufacturer", and "Color", while another returns a list of its own. The values of these properties are returned in the GET /v1/products/:id response, and in list and search responses when you include the property name in select.
Examples
curl — personal key
curl "https://vibecode.bitrix24.com/v1/products/fields" \
-H "X-Api-Key: YOUR_API_KEY"
curl — OAuth application
curl "https://vibecode.bitrix24.com/v1/products/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/products/fields', {
headers: { 'X-Api-Key': 'YOUR_API_KEY' },
})
const { success, data } = await res.json()
console.log('Total fields:', Object.keys(data.fields).length)
JavaScript — OAuth application
const res = await fetch('https://vibecode.bitrix24.com/v1/products/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 | Type | Description |
|---|---|---|
Fieldsuccess |
Typeboolean | DescriptionAlways true on success |
Fielddata.fields |
Typeobject | DescriptionField map. The key is the field name, and the value is { type, readonly, label }. Write-only fields also carry writeOnly, non-returned fields carry notReturned, and some fields carry description or enum |
Response example
A subset of fields is shown. The actual number of PROPERTY_<N> properties depends on the catalog settings in the Bitrix24 account.
{
"success": true,
"data": {
"fields": {
"id": { "type": "number", "readonly": true, "label": "Product identifier" },
"name": { "type": "string", "readonly": false, "label": "Product name" },
"active": { "type": "boolean", "readonly": false, "label": "Active", "description": "Whether the product is active." },
"price": { "type": "number", "readonly": false, "label": "Product price" },
"currencyId": {
"type": "string",
"readonly": false,
"writeOnly": true,
"notReturned": true,
"label": "Price currency (alias)",
"description": "Write alias of currency. Responses return the value under currency. If both names are present, currency wins. List: GET /v1/currencies."
},
"currency": {
"type": "string",
"readonly": false,
"label": "Price currency",
"description": "Currency of the price. Write alias: currencyId. If both names are present, currency wins. Available values: GET /v1/currencies."
},
"descriptionType": {
"type": "string",
"readonly": false,
"label": "Description format",
"description": "Format of the description field: plain text or HTML markup.",
"enum": [
{ "value": "text", "label": "Plain text" },
{ "value": "html", "label": "HTML" }
]
},
"vatIncluded": { "type": "boolean", "readonly": false, "label": "VAT included", "description": "Whether the VAT is already included in the price." },
"createdAt": { "type": "datetime", "readonly": true, "label": "Creation date" },
"PROPERTY_301": { "type": "product_property", "readonly": false, "label": "SKU" },
"PROPERTY_303": { "type": "product_property", "readonly": false, "label": "Manufacturer" },
"PROPERTY_307": { "type": "product_property", "readonly": false, "label": "Color" }
}
}
}
Error response example
403 — no scope:
{
"success": false,
"error": {
"code": "SCOPE_DENIED",
"message": "This endpoint requires 'crm' scope"
}
}
Errors
| HTTP | Code | Description |
|---|---|---|
| HTTP403 | CodeSCOPE_DENIED |
DescriptionThe API key lacks the crm scope |
| HTTP401 | CodeMISSING_API_KEY |
DescriptionThe X-Api-Key header is missing |
| 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.
Known specifics
The same product in the catalog has more fields. The product with the same id is available via GET /v1/catalog-products, where it has a wider field set — stock, warehouse, and variations.
A PROPERTY_<N> descriptor carries the property name only — it holds no list options. The descriptor object is exactly { type: "product_property", readonly, label }: no items, no values, no list of allowed values whatsoever. So this endpoint tells you that property 301 is called "SKU", but nothing here resolves the selected option's identifier into its text.
Where to go for the values:
| Task | Call |
|---|---|
| TaskReadable text of a property on a single product | CallGET /v1/catalog-products/:id — the text arrives ready-made in propertyNNN.valueEnum |
| TaskAll options of a list property (a dropdown, a filter, an export) | CallGET /v1/catalog-product-property-enums?filter[propertyId]=NNN&limit=1000 |
TaskThe property type (propertyType, listType, multiple) |
CallGET /v1/catalog-product-properties/:id |
Here NNN is the number from the PROPERTY_<N> key: it is the same value, the catalog property id. All three catalog calls require the catalog scope — a key carrying only crm gets 403 SCOPE_DENIED.