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

Get a product from an invoice

GET /v1/invoices/:id/products/:rowId

Returns a single invoice product row by row ID.

Parameters

Parameter Type Req. Description
id (path) number yes Invoice ID
rowId (path) number yes Product row ID (from the add or list response)

rowId is the product row ID, not the productId from the product catalog.

Examples

curl — personal key

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

curl — OAuth application

Terminal
curl -X GET "https://vibecode.bitrix24.com/v1/invoices/741/products/1471" \
  -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/1471', {
  headers: {
    'X-Api-Key': 'YOUR_API_KEY',
  },
})

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

JavaScript — OAuth application

javascript
const res = await fetch('https://vibecode.bitrix24.com/v1/invoices/741/products/1471', {
  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.id number Product row ID
data.productId number Catalog product ID
data.productName string Product name
data.price number Price per unit
data.quantity number Quantity
data.discount number Discount amount
data.discountRate number Discount percentage
data.discountTypeId number Discount type — 1 means an amount, 2 a percentage
data.taxRate number | null Tax rate (%)
data.taxIncluded boolean Tax included in the price
data.priceExclusive number Price excluding tax, with discount
data.priceNetto number Net price
data.priceBrutto number Gross price
data.priceAccount number Price in the reporting currency
data.measureCode number Unit of measure code
data.measureName string Unit of measure name
data.sort number Sort order
data.ownerId number ID of the owner entity the row belongs to
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
data.customized string Whether the row was edited manually — Y or N
data.xmlId string External row code
data.type number Row type

Response example

JSON
{
  "success": true,
  "data": {
    "id": 1471,
    "productId": 1,
    "productName": "Server equipment",
    "price": 5000,
    "priceAccount": 5000,
    "priceExclusive": 5000,
    "priceNetto": 5000,
    "priceBrutto": 5000,
    "quantity": 3,
    "discountTypeId": 2,
    "discountRate": 0,
    "discount": 0,
    "taxRate": null,
    "taxIncluded": false,
    "customized": "Y",
    "measureCode": 796,
    "measureName": "pcs",
    "sort": 0,
    "ownerId": 741,
    "ownerType": "SI",
    "storeId": 3,
    "xmlId": "sale_basket_995",
    "type": 1
  }
}

Error response example

404 — invoice or product row not found:

JSON
{
  "success": false,
  "error": {
    "code": "ENTITY_NOT_FOUND",
    "message": "Item not found"
  }
}

Errors

HTTP Code Description
404 ENTITY_NOT_FOUND Invoice or product row not found
400 INVALID_ROW_ID The rowId in the URL is not a positive integer
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