Retrieve a product line
Operation ID: getAccountingProductLine
Group: Accounting › Products › Product Lines
Open in the interactive reference
GET /accounting/product-lines/{id}
Read-only: Reads and returns; changes nothing.
Retrieves a product line. Use the product line's id, not its productLineNumber.
The response includes the product line's tax records, its pricing headers with their price book entries, and its external identifiers.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
Api-Version |
header | string · v1 | yes | The API version this request targets, named by its public identifier. Required on every request; omitting it, or naming a version this company does not have, is answered with 400. This document describes version v1. |
id |
path | string | yes | The unique identifier of the product line you want to retrieve. |
Response
200 Success
Under data (getAccountingProductLineOutput):
| Field | Type | Required | Description |
|---|---|---|---|
id |
string | yes | The unique identifier for the product line. |
productId |
string | yes | The product the product line belongs to. See id on GET accounting/products/:id. |
productName |
string | no | The display name of the product. See productName on GET accounting/products/:id. |
productLineNumber |
string | no | The product line number, assigned by the system and unique within the tenant. Example: 'PL-1001'. |
name |
string | yes | The name of the product line. |
lineType |
string | no | The type of product line. Possible values: 'recurring', 'oneTime', 'commitWithOverage', 'payAsYouGo', 'usage', 'prepaid', 'billableTime', 'billableTravelExpense', 'billablePassThrough'. |
priceModel |
string | no | How the product line is priced. Possible values: 'flat', 'perUnit', 'tiered', 'volume', 'stairstep', 'rateCard', 'thresholdBased'. |
pricingTerm |
string | no | The pricing term of the product line. Possible values: 'monthly', 'biMonthly', 'once', 'quarterly', 'semiAnnually', 'annually'. |
invoiceFrequency |
string | no | How often the product line is invoiced. Possible values: 'monthly', 'biMonthly', 'quarterly', 'semiAnnually', 'annually', 'once', 'custom', 'template', 'milestone', 'allAtOnce', 'termEnd'. |
unitOfMeasure |
string | no | The unit the product line's quantities are measured in. Possible values: 'instance', 'gigabyte', 'terabyte', 'user', 'seat', 'minute', 'hour', 'day', 'month', 'each', 'license', 'activeUser', 'megabyte', 'message', 'text', 'platform', 'employee', 'personnel', 'credit', 'currency', 'package', 'case', 'word', 'record'. |
taxMode |
string | no | How the product line's prices are quoted for tax. Possible values: 'TaxInclusive', 'TaxExclusive'. Absent if no tax provider was enabled in your tenant when the product line was last saved. |
enforceListPrice |
boolean | no | Whether the list price of the product line is enforced. When true, the list price comes from the price book and can't be changed on a sales order, a quote, or a subscription change. An unset value counts as true. |
hasUsage |
boolean | no | Whether the product line has a paired 'usage' line. True for 'prepaid' lines, and for 'recurring' lines whose priceModel is 'thresholdBased' or whose commitInvoicing has a value. |
hasBeenUsed |
boolean | no | Whether the product line is on at least one sales order. |
commitInvoicing |
string | no | When the minimum spend commit of a 'recurring' product line is invoiced. Possible values: 'advance', 'arrears'. Absent when the product line has no minimum spend commit. |
prepaidBalanceOverConsumptionBehavior |
string | no | What happens when usage exceeds the prepaid balance. Possible values: 'allowNegative', 'overage'. Applies only when lineType is 'prepaid'. |
prepaidBalanceRolloverAtRenewal |
boolean | no | Whether the remaining prepaid balance rolls over at renewal. Applies only when lineType is 'prepaid'. |
parentProductLineId |
string | no | The product line this 'usage' line is paired with. See id on GET accounting/product-lines/:id. Absent when the product line is not a paired 'usage' line. |
crmProductId |
string | no | The product line's identifier in an external CRM system. |
dataSource |
string | no | The source system or import job that produced the product line. Examples: 'Salesforce', 'NetSuite', 'Stripe'. |
createdDate |
date-time | no | The date and time the product line was created, in UTC. Format YYYY-MM-DDTHH:mm:ss.sssZ. |
lastModifiedDate |
date-time | yes | The date and time the product line last changed, in UTC. Format YYYY-MM-DDTHH:mm:ss.sssZ. |
productLineTaxes |
array<object> | no | The tax records of the product line. Absent when the product line has none. |
productLineTaxes[].id |
string | yes | The unique identifier for the tax record. |
productLineTaxes[].taxCode |
string | yes | The tax code, as defined by the configured tax provider. |
productLineTaxes[].engine |
string | yes | The tax engine that computes this tax. Possible values: 'avalara', 'anrok', 'everestTaxEngine', 'manualTax', 'none'. |
productLineTaxes[].country |
string | no | The country the tax record applies in. Format ISO 3166-1, for example 'US'. |
productLineTaxes[].entityId |
string | no | The legal entity this tax record applies under. See id on GET base/entities. |
pricingHeaders |
array<object> | no | The pricing headers of the product line, each with its price book entries. Absent when the product line has no pricing. |
pricingHeaders[].id |
string | yes | The unique identifier for the pricing header. See id on GET accounting/pricing/:id. |
pricingHeaders[].headerNumber |
string | no | The pricing header number, assigned by the system and unique within the tenant. |
pricingHeaders[].priceBookId |
string | no | The price book this header belongs to. See id on GET accounting/price-books/:id. |
pricingHeaders[].priceBookName |
string | no | The display name of the price book. See priceBookName on GET accounting/price-books/:id. |
pricingHeaders[].currency |
string | yes | The currency the header's prices are in. Format ISO 4217, for example 'USD'. |
pricingHeaders[].validFrom |
date | yes | The first date the header's prices are effective, inclusive. Format YYYY-MM-DD. |
pricingHeaders[].validTo |
date | no | The last date the header's prices are effective, inclusive. Format YYYY-MM-DD. Absent for a header with no end date. |
pricingHeaders[].priceBookEntries |
array<object> | yes | The price book entries of the pricing header. For a product line priced 'tiered', 'volume', 'stairstep', or 'thresholdBased', each entry is one tier: a quantity range with its own price. A 'flat' or 'perUnit' line has one entry, and a 'rateCard' line has one entry per rate-card entry. |
pricingHeaders[].priceBookEntries[].id |
string | yes | The unique identifier for the price book entry. |
pricingHeaders[].priceBookEntries[].priceBookEntryNumber |
string | no | The price book entry number, assigned by the system. |
pricingHeaders[].priceBookEntries[].listPrice |
decimal | no | The list price, in the header currency. On a rate-card entry, the list price is the rate. |
pricingHeaders[].priceBookEntries[].fromQuantity |
decimal | no | The lowest quantity in the tier, inclusive. Used only when the product line is priced 'tiered', 'volume', 'stairstep', or 'thresholdBased'. |
pricingHeaders[].priceBookEntries[].toQuantity |
decimal | no | The highest quantity in the tier, inclusive. Absent on the top tier, which has no upper limit. |
pricingHeaders[].priceBookEntries[].priceModel |
string | no | How the tier prices its quantity. Possible values: 'flat', 'perUnit', 'tiered', 'volume', 'stairstep', 'rateCard', 'thresholdBased'. |
pricingHeaders[].priceBookEntries[].rateCardEntry |
object | no | The rate-card entry attached to this price book entry. Absent when the entry is not rate-card priced. |
pricingHeaders[].priceBookEntries[].rateCardEntry.id |
string | yes | The unique identifier for the rate-card entry. |
pricingHeaders[].priceBookEntries[].rateCardEntry.billableComponentId |
string | no | The unique identifier of the billable component this rate-card entry prices. No endpoint returns billable components. |
pricingHeaders[].priceBookEntries[].rateCardEntry.unitOfMeasure |
string | yes | The unit the rate is quoted in. Possible values: 'instance', 'gigabyte', 'terabyte', 'user', 'seat', 'minute', 'hour', 'day', 'month', 'each', 'license', 'activeUser', 'megabyte', 'message', 'text', 'platform', 'employee', 'personnel', 'credit', 'currency', 'package', 'case', 'word', 'record'. |
pricingHeaders[].priceBookEntries[].rateCardEntry.description |
string | no | A description of the rate-card entry. The description distinguishes the entry from other rate-card entries on the same billable component. |
pricingHeaders[].priceBookEntries[].rateCardEntry.usageType |
string | no | How usage is measured against this entry. Possible values: 'consumption', 'overage', 'thresholdCounter', 'payg'. |
pricingHeaders[].priceBookEntries[].rateCardEntry.billableUnitOfMeasure |
string | no | The unit used when billing this entry. Possible values: 'instance', 'gigabyte', 'terabyte', 'user', 'seat', 'minute', 'hour', 'day', 'month', 'each', 'license', 'activeUser', 'megabyte', 'message', 'text', 'platform', 'employee', 'personnel', 'credit', 'currency', 'package', 'case', 'word', 'record'. |
pricingHeaders[].priceBookEntries[].rateCardEntry.conversion |
decimal | no | The multiplier that converts unitOfMeasure quantities into billableUnitOfMeasure quantities. |
pricingHeaders[].priceBookEntries[].rateCardEntry.invoiceFrequency |
string | no | How often usage on this entry is invoiced. Possible values: 'monthly', 'biMonthly', 'quarterly', 'semiAnnually', 'annually', 'once', 'custom', 'template', 'milestone', 'allAtOnce', 'termEnd'. |
pricingHeaders[].priceBookEntries[].rateCardEntry.priceModel |
string | no | How the rate-card entry's price is calculated. Possible values: 'flat', 'perUnit', 'tiered', 'volume', 'stairstep', 'rateCard', 'thresholdBased'. Absent when no price model was set on the rate-card entry. |
externalIdentifiers |
array<object> | no | External identifiers owned by other systems, at most one per fieldName. Absent when the product line has none. |
externalIdentifiers[].fieldName |
string | yes | The configured field name of the external identifier, not its display label. |
externalIdentifiers[].value |
string | yes | The identifier's value in the source system. |
externalIdentifiers[].externalUrl |
string | no | An absolute http or https link to the object in the source system. Absent when none is set. |
{
"data": {
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"productId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"productName": "<productName>",
"productLineNumber": "<productLineNumber>",
"name": "<name>",
"lineType": "<lineType>",
"priceModel": "<priceModel>",
"pricingTerm": "<pricingTerm>",
"invoiceFrequency": "<invoiceFrequency>",
"unitOfMeasure": "<unitOfMeasure>",
"taxMode": "<taxMode>",
"enforceListPrice": true,
"hasUsage": true,
"hasBeenUsed": true,
"commitInvoicing": "<commitInvoicing>",
"prepaidBalanceOverConsumptionBehavior": "<prepaidBalanceOverConsumptionBehavior>",
"prepaidBalanceRolloverAtRenewal": true,
"parentProductLineId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"crmProductId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"dataSource": "<dataSource>",
"createdDate": "2026-01-15T09:30:00.000Z",
"lastModifiedDate": "2026-01-15T09:30:00.000Z",
"productLineTaxes": [
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"taxCode": "<taxCode>",
"engine": "<engine>",
"country": "<country>",
"entityId": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
}
],
"pricingHeaders": [
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"headerNumber": "<headerNumber>",
"priceBookId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"priceBookName": "<priceBookName>",
"currency": "<currency>",
"validFrom": "2026-01-15",
"validTo": "2026-01-15",
"priceBookEntries": [
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"priceBookEntryNumber": "<priceBookEntryNumber>",
"listPrice": "19.99",
"fromQuantity": "19.99",
"toQuantity": "19.99",
"priceModel": "<priceModel>",
"rateCardEntry": {
"id": null,
"billableComponentId": null,
"unitOfMeasure": null,
"description": null,
"usageType": null,
"billableUnitOfMeasure": null,
"conversion": null,
"invoiceFrequency": null,
"priceModel": null
}
}
]
}
],
"externalIdentifiers": [
{
"fieldName": "<fieldName>",
"value": "<value>",
"externalUrl": "<externalUrl>"
}
]
},
"diagnostics": [
{
"code": "<code>",
"message": "<message>",
"severity": "error",
"path": [
"<path>"
],
"details": "<details>"
}
]
}
Errors
| Code | Status |
|---|---|
INVALID_ID |
400 |
NOT_FOUND |
400 |
Statuses
400— Invalid request or business failure. Codes: INVALID_ID, NOT_FOUND401— The request carries no valid access token.403— Not authorized404— Not found429— Too many requests from this client address. The response has no body and noRetry-Afterheader.500— Internal server error