List product lines
Operation ID: productLines
Group: Accounting › Products › Product Lines
Open in the interactive reference
GET /accounting/product-lines
Read-only: Reads and returns; changes nothing.
Lists product lines. Each item is the product line without its tax records, pricing, and external identifiers. To get the tax records, pricing, and external identifiers, use GET accounting/product-lines/:id or POST accounting/product-lines/search. To filter by free text, product line number, CRM identifier, or external identifier, use POST accounting/product-lines/search.
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. |
Query surface
id— filter by eq, ne, gt, gte, lt, lte, in, notIn, between, likeproductId— filter by eq, ne, gt, gte, lt, lte, in, notIn, between, likelineType— filter by eq, ne, gt, gte, lt, lte, in, notIn, between, likepriceModel— filter by eq, ne, gt, gte, lt, lte, in, notIn, between, likepricingTerm— filter by eq, ne, gt, gte, lt, lte, in, notIn, between, likeinvoiceFrequency— filter by eq, ne, gt, gte, lt, lte, in, notIn, between, likeunitOfMeasure— filter by eq, ne, gt, gte, lt, lte, in, notIn, between, liketaxMode— filter by eq, ne, gt, gte, lt, lte, in, notIn, between, likeenforceListPrice— filter by eq, ne, gt, gte, lt, lte, in, notIn, betweenhasUsage— filter by eq, ne, gt, gte, lt, lte, in, notIn, betweenhasBeenUsed— filter by eq, ne, gt, gte, lt, lte, in, notIn, betweenparentProductLineId— filter by eq, ne, gt, gte, lt, lte, in, notIn, between, likedataSource— filter by eq, ne, gt, gte, lt, lte, in, notIn, between, likecreatedDate— filter by eq, ne, gt, gte, lt, lte, in, notIn, betweenlastModifiedDate— filter by eq, ne, gt, gte, lt, lte, in, notIn, between- Orderable: id, productId, productName, name, lineType, priceModel, pricingTerm, invoiceFrequency, unitOfMeasure, taxMode, enforceListPrice, hasUsage, hasBeenUsed, parentProductLineId, dataSource, createdDate, lastModifiedDate
- Selectable: id, productId, productName, productLineNumber, name, lineType, priceModel, pricingTerm, invoiceFrequency, unitOfMeasure, taxMode, enforceListPrice, hasUsage, hasBeenUsed, commitInvoicing, prepaidBalanceOverConsumptionBehavior, prepaidBalanceRolloverAtRenewal, parentProductLineId, crmProductId, dataSource, createdDate, lastModifiedDate
page[size]— Page sizepage[cursor]— Opaque continuation cursor
Response
200 Success
Under data, an array of productLinesRow:
| Field | Type | Required | Filter | Sort | Description |
|---|---|---|---|---|---|
id |
string | no | Exact (eq, ne), Range (gt, gte, lt, lte, between), Any of (in, notIn), Pattern (like) |
yes | The unique identifier for the product line. |
productId |
string | no | Exact (eq, ne), Range (gt, gte, lt, lte, between), Any of (in, notIn), Pattern (like) |
yes | The product the product line belongs to. See id on GET accounting/products/:id. |
productName |
string | null | no | no | yes | The display name of the product. See productName on GET accounting/products/:id. |
productLineNumber |
string | null | no | no | no | The product line number, assigned by the system and unique within the tenant. Example: 'PL-1001'. |
name |
string | no | no | yes | The name of the product line. |
lineType |
string | null | no | Exact (eq, ne), Range (gt, gte, lt, lte, between), Any of (in, notIn), Pattern (like) |
yes | The type of product line. Possible values: 'recurring', 'oneTime', 'commitWithOverage', 'payAsYouGo', 'usage', 'prepaid', 'billableTime', 'billableTravelExpense', 'billablePassThrough'. |
priceModel |
string | null | no | Exact (eq, ne), Range (gt, gte, lt, lte, between), Any of (in, notIn), Pattern (like) |
yes | How the product line is priced. Possible values: 'flat', 'perUnit', 'tiered', 'volume', 'stairstep', 'rateCard', 'thresholdBased'. |
pricingTerm |
string | null | no | Exact (eq, ne), Range (gt, gte, lt, lte, between), Any of (in, notIn), Pattern (like) |
yes | The pricing term of the product line. Possible values: 'monthly', 'biMonthly', 'once', 'quarterly', 'semiAnnually', 'annually'. |
invoiceFrequency |
string | null | no | Exact (eq, ne), Range (gt, gte, lt, lte, between), Any of (in, notIn), Pattern (like) |
yes | How often the product line is invoiced. Possible values: 'monthly', 'biMonthly', 'quarterly', 'semiAnnually', 'annually', 'once', 'custom', 'template', 'milestone', 'allAtOnce', 'termEnd'. |
unitOfMeasure |
string | null | no | Exact (eq, ne), Range (gt, gte, lt, lte, between), Any of (in, notIn), Pattern (like) |
yes | 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 | null | no | Exact (eq, ne), Range (gt, gte, lt, lte, between), Any of (in, notIn), Pattern (like) |
yes | 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 | null | no | Exact (eq, ne), Range (gt, gte, lt, lte, between), Any of (in, notIn) |
yes | 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 | null | no | Exact (eq, ne), Range (gt, gte, lt, lte, between), Any of (in, notIn) |
yes | 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 | null | no | Exact (eq, ne), Range (gt, gte, lt, lte, between), Any of (in, notIn) |
yes | Whether the product line is on at least one sales order. |
commitInvoicing |
string | null | no | no | 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 | null | no | no | no | What happens when usage exceeds the prepaid balance. Possible values: 'allowNegative', 'overage'. Applies only when lineType is 'prepaid'. |
prepaidBalanceRolloverAtRenewal |
boolean | null | no | no | no | Whether the remaining prepaid balance rolls over at renewal. Applies only when lineType is 'prepaid'. |
parentProductLineId |
string | null | no | Exact (eq, ne), Range (gt, gte, lt, lte, between), Any of (in, notIn), Pattern (like) |
yes | 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 | null | no | no | no | The product line's identifier in an external CRM system. |
dataSource |
string | null | no | Exact (eq, ne), Range (gt, gte, lt, lte, between), Any of (in, notIn), Pattern (like) |
yes | The source system or import job that produced the product line. Examples: 'Salesforce', 'NetSuite', 'Stripe'. |
createdDate |
date-time | null | no | Exact (eq, ne), Range (gt, gte, lt, lte, between), Any of (in, notIn) |
yes | The date and time the product line was created, in UTC. Format YYYY-MM-DDTHH:mm:ss.sssZ. |
lastModifiedDate |
date-time | no | Exact (eq, ne), Range (gt, gte, lt, lte, between), Any of (in, notIn) |
yes | The date and time the product line last changed, in UTC. Format YYYY-MM-DDTHH:mm:ss.sssZ. |
{
"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"
}
],
"pagination": {
"hasMore": true,
"nextCursor": "<nextCursor>"
}
}
Statuses
400— Invalid request or business failure401— 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