For AI agents: markdown of this page — /docs-content-en/entities/quotes/products-get.md documentation index — /llms.txt
Quote product rows
GET /v1/quotes/:id/products
Returns the list of product rows attached to a quote.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
id (path) |
number | yes | Quote ID |
limit (query) |
number | no | How many rows to return per call, from 1 to 5000, 50 by default. A value above 5000 is clamped to 5000. limit=0 is not a page size: the default applies and meta.warnings carries an entry with code LIMIT_ZERO_IGNORED |
offset (query) |
number | no | Offset in rows, not in pages: offset=7 starts the output at the eighth row |
Without limit and offset the endpoint returns the first page of results. meta.hasMore tells you whether rows exist beyond it, and meta.total how many the quote has in total.
Examples
curl — personal key
curl "https://vibecode.bitrix24.com/v1/quotes/741/products" \
-H "X-Api-Key: YOUR_API_KEY"
curl — OAuth app
curl "https://vibecode.bitrix24.com/v1/quotes/741/products" \
-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/741/products', {
headers: {
'X-Api-Key': 'YOUR_API_KEY',
},
})
const { success, data } = await res.json()
console.log('Products:', data.length)
JavaScript — OAuth app
const res = await fetch('https://vibecode.bitrix24.com/v1/quotes/741/products', {
headers: {
'X-Api-Key': 'YOUR_APP_KEY',
'Authorization': 'Bearer USER_SESSION_TOKEN',
},
})
const { success, data } = await res.json()
Response fields
| Field | Type | Description |
|---|---|---|
success |
boolean | Always true on success |
data |
array | Array of product rows |
data[].id |
number | Product row ID. The same value appears as rowId in single-row operations |
data[].productId |
number | Product ID. Catalog: GET /v1/products |
data[].productName |
string | Product name |
data[].price |
number | Unit price |
data[].quantity |
number | Quantity |
data[].discount |
number | Discount amount |
data[].taxRate |
number/null | Tax rate (%) |
data[].taxIncluded |
boolean | Tax included in price |
data[].ownerId |
number | ID of the owning quote, the same one as in the request path |
data[].ownerType |
string | Row owner type, Q for a quote |
data[].storeId |
number | null | Warehouse ID. List: GET /v1/warehouses. null when inventory management is off |
meta.total |
number | How many product rows the quote has in total. Present when Bitrix24 returned the count, otherwise the field is absent from the response. |
meta.hasMore |
boolean | Whether rows exist beyond the returned page. Correct for any requested window, not only the first one |
meta.warnings |
array | Present only when the request carried limit=0: a single entry with code equal to LIMIT_ZERO_IGNORED |
The main fields are shown. Full list (23 fields, including priceAccount, measureCode and others): Product fields.
Response example
{
"success": true,
"data": [
{
"id": 1667,
"ownerId": 741,
"ownerType": "Q",
"productId": 1,
"productName": "Server equipment",
"price": 1000,
"quantity": 2,
"discount": 0,
"taxRate": null,
"taxIncluded": false,
"storeId": null
}
],
"meta": {
"total": 1,
"hasMore": false
}
}
Error response example
404 — quote not found:
{
"success": false,
"error": {
"code": "ENTITY_NOT_FOUND",
"message": "Item not found"
}
}
Errors
| HTTP | Code | Description |
|---|---|---|
| 404 | ENTITY_NOT_FOUND |
Quote not found |
| 403 | SCOPE_DENIED |
API key does not have 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.