For AI agents: markdown of this page — /docs-content-en/entities/invoices/products-get.md documentation index — /llms.txt

Invoice product rows

GET /v1/invoices/:id/products

Returns the list of product rows attached to an invoice.

Parameters

Parameter Type Req. Description
id (path) number yes Invoice 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 invoice has in total.

Examples

curl — personal key

Terminal
curl "https://vibecode.bitrix24.com/v1/invoices/741/products" \
  -H "X-Api-Key: YOUR_API_KEY"

curl — OAuth application

Terminal
curl "https://vibecode.bitrix24.com/v1/invoices/741/products" \
  -H "X-Api-Key: YOUR_APP_KEY" \
  -H "Authorization: Bearer USER_SESSION_TOKEN"

JavaScript — personal key

javascript
const res = await fetch('https://vibecode.bitrix24.com/v1/invoices/741/products', {
  headers: {
    'X-Api-Key': 'YOUR_API_KEY',
  },
})

const { success, data } = await res.json()
console.log('Products:', data.length)

JavaScript — OAuth application

javascript
const res = await fetch('https://vibecode.bitrix24.com/v1/invoices/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 Price per unit
data[].quantity number Quantity
data[].discount number Discount amount
data[].taxRate number/null Tax rate (%)
data[].taxIncluded boolean Tax included in the price
data[].ownerId number ID of the owning invoice, the same one as in the request path
data[].ownerType string Row owner type, SI for an invoice
data[].storeId number | null Warehouse ID. List: GET /v1/warehouses. null when inventory management is off
meta.total number How many product rows the invoice 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. Accurate for any requested window, not just the first one
meta.warnings array Present only when the request carried limit=0: a single entry with code equal to LIMIT_ZERO_IGNORED

Only the main fields are shown. The full list of 25 fields, including priceAccount and measureCode, is in Product fields.

Response example

JSON
{
  "success": true,
  "data": [
    {
      "id": 1669,
      "ownerId": 741,
      "ownerType": "SI",
      "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

403 — no invoice with that id exists, or the employee's permissions restrict access to it:

JSON
{
  "success": false,
  "error": {
    "code": "BITRIX_ACCESS_DENIED",
    "message": "Access denied"
  }
}

Errors

HTTP Code Description
403 BITRIX_ACCESS_DENIED No invoice with that id exists, or the employee's permissions restrict access to it. A nonexistent invoice returns this code, not 404
422 BITRIX_ERROR The id in the URL is not a number — message Argument '=ownerId' is required
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.

See also