# Get Accounting Product Line

`GET /accounting/product-lines/{id}`

Group: Accounting › Products › Product Lines · Operation ID: `getAccountingProductLine`

Fetch a single product line by its id (a UUID), bound from the :id path segment. Returns the full record including tax records, pricing headers with their entries and rate cards, and external identifiers — the same item schema as POST accounting/product-lines/search. Read-only. Raises NOT_FOUND when no product line has that id (should map to 404). Every request must carry the Api-Version header.

[Open in the interactive reference](https://docs.api.lensing.ai/?op=getAccountingProductLine)

## Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `Api-Version` | header | `"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 | Id of the product line to fetch (a UUID); bound from the :id path segment. |

## Response

`200` Success

Under `data` (getAccountingProductLineOutput):

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `id` | string | yes | Id of the product line (a UUID) — the public identifier used by this route. |
| `productId` | string | yes | Id of the parent product (a UUID) — GET accounting/products/:id. |
| `productName` | string | no | Display name of the parent product. |
| `productLineNumber` | string | no | System-generated product line number, unique per tenant. Absent until one has been assigned. |
| `name` | string | yes | Product line display name. |
| `lineType` | string | no | Line type. One of 'recurring', 'oneTime', 'commitWithOverage', 'payAsYouGo', 'usage', 'prepaid', 'billableTime', 'billableTravelExpense', 'billablePassThrough'. |
| `priceModel` | string | no | Price model. One of 'flat', 'perUnit', 'tiered', 'volume', 'stairstep', 'rateCard', 'thresholdBased'. |
| `pricingTerm` | string | no | Pricing term. One of 'monthly', 'biMonthly', 'once', 'quarterly', 'semiAnnually', 'annually'. |
| `invoiceFrequency` | string | no | Invoice frequency. One of 'monthly', 'biMonthly', 'quarterly', 'semiAnnually', 'annually', 'once', 'custom', 'template', 'milestone', 'allAtOnce', 'termEnd'. |
| `unitOfMeasure` | string | no | Unit of measure quantities are tracked in. One of '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 | Tax mode. One of 'TaxInclusive', 'TaxExclusive' (PascalCase members). |
| `enforceListPrice` | boolean | no | When true, sales transactions on this line cannot override the list price. |
| `hasUsage` | boolean | no | True when this Prepaid line has a paired Usage line. |
| `hasBeenUsed` | boolean | no | True once the line has been sold on at least one sales order. Computed; never settable. |
| `commitInvoicing` | string | no | Invoice timing of a commit line. One of 'advance', 'arrears'. Absent on other line types. |
| `prepaidBalanceOverConsumptionBehavior` | string | no | What happens when usage exceeds the prepaid balance. One of 'allowNegative', 'overage'. Prepaid lines only. |
| `prepaidBalanceRolloverAtRenewal` | boolean | no | Whether the remaining prepaid balance rolls over at renewal. Prepaid lines only. |
| `parentProductLineId` | string | no | Id of the parent Prepaid product line (a UUID) when this is its paired Usage line. |
| `crmProductId` | string | no | CRM system's own identifier for this product line, when integrated from one. |
| `dataSource` | string | no | Upstream system or import job that produced this line, e.g. 'Everest', 'Salesforce'. Tenant-configurable, not exhaustively enumerable. |
| `createdDate` | string (date-time) | no | Instant the record was created, as ISO 8601 UTC (YYYY-MM-DDTHH:mm:ss.sssZ), when recorded. |
| `lastModifiedDate` | string (date-time) | yes | Instant the record last changed, as ISO 8601 UTC (YYYY-MM-DDTHH:mm:ss.sssZ). Poll on this to sync incrementally. |
| `productLineTaxes` | array of object | no | Tax records attached to this line. Absent when it has none. |
| `productLineTaxes[].id` | string | yes | Id of the tax record (a UUID). |
| `productLineTaxes[].taxCode` | string | yes | Tax code as defined by the configured tax provider. |
| `productLineTaxes[].engine` | string | yes | Tax engine. One of 'avalara', 'anrok', 'everestTaxEngine', 'manualTax', 'none'. |
| `productLineTaxes[].country` | string | no | ISO 3166-1 country code the record applies in. |
| `productLineTaxes[].entityId` | string | no | Id of the legal entity the record applies under (a UUID). |
| `pricingHeaders` | array of object | no | Pricing headers of this line, each with its price-book entries. Absent when the line has no pricing. Amounts are in the header's currency. |
| `pricingHeaders[].id` | string | yes | Id of the pricing header (a UUID) — the :pricingId of the pricing routes. |
| `pricingHeaders[].headerNumber` | string | no | System-generated header number. |
| `pricingHeaders[].priceBookId` | string | no | Id of the price book this header belongs to (a UUID). |
| `pricingHeaders[].priceBookName` | string | no | Name of that price book. |
| `pricingHeaders[].currency` | string | yes | ISO 4217 currency code governing every amount in this header. |
| `pricingHeaders[].validFrom` | string (date) | yes | First date the header's prices are effective (YYYY-MM-DD, inclusive). |
| `pricingHeaders[].validTo` | string (date) | no | Last effective date (YYYY-MM-DD, inclusive). Absent when open-ended. |
| `pricingHeaders[].priceBookEntries` | array of object | yes | Price-book entries of the header: one for flat pricing, one per tier for tiered models, one per rate card for rate-card pricing. |
| `pricingHeaders[].priceBookEntries[].id` | string | yes | Id of the entry (a UUID). |
| `pricingHeaders[].priceBookEntries[].priceBookEntryNumber` | string | no | System-generated entry number. |
| `pricingHeaders[].priceBookEntries[].listPrice` | string (decimal) | no | List price, or the rate for a rate-card entry, as a decimal in the header currency (see currency). |
| `pricingHeaders[].priceBookEntries[].fromQuantity` | string (decimal) | no | Inclusive lower bound of this tier's quantity range. Tiered models only. |
| `pricingHeaders[].priceBookEntries[].toQuantity` | string (decimal) | no | Inclusive upper bound of this tier's quantity range. Absent on the open-ended top tier. |
| `pricingHeaders[].priceBookEntries[].priceModel` | string | no | How this tier prices quantity. One of 'flat', 'perUnit'. Tiered models only. |
| `pricingHeaders[].priceBookEntries[].rateCardEntry` | object | no | Rate card priced by this entry. Rate-card pricing only. |
| `pricingHeaders[].priceBookEntries[].rateCardEntry.id` | string | yes | Id of the rate-card entry (a UUID). |
| `pricingHeaders[].priceBookEntries[].rateCardEntry.billableComponentId` | string | no | Id of the billable component this rate prices (a UUID). |
| `pricingHeaders[].priceBookEntries[].rateCardEntry.unitOfMeasure` | string | yes | Unit of measure of the rate card. |
| `pricingHeaders[].priceBookEntries[].rateCardEntry.description` | string | no | Rate-card description. |
| `pricingHeaders[].priceBookEntries[].rateCardEntry.usageType` | string | no | Usage type the rate applies to. |
| `pricingHeaders[].priceBookEntries[].rateCardEntry.billableUnitOfMeasure` | string | no | Unit of measure the usage is billed in, when it differs from unitOfMeasure. |
| `pricingHeaders[].priceBookEntries[].rateCardEntry.conversion` | string (decimal) | no | Conversion factor from unitOfMeasure to billableUnitOfMeasure. A quantity, not an amount. |
| `pricingHeaders[].priceBookEntries[].rateCardEntry.invoiceFrequency` | string | no | Invoice frequency of the rate card, when it differs from the line. |
| `pricingHeaders[].priceBookEntries[].rateCardEntry.priceModel` | string | no | Price model of the rate card, when it differs from the line. |
| `externalIdentifiers` | array of object | no | External identifiers owned by other systems. At most one entry per fieldName. Absent when the line has none. |
| `externalIdentifiers[].fieldName` | string | yes | Configured key of the external identifier — a stable camelCase slug, not the human-readable label. |
| `externalIdentifiers[].value` | string | yes | The identifier as the source system holds it. |
| `externalIdentifiers[].externalUrl` | string | no | Absolute http(s) link to the object in the originating system, when one is stored. |

## Errors

| Code | Status |
| --- | --- |
| `INVALID_ID` | 400 |
| `NOT_FOUND` | 400 |

## Statuses

- `400` — Invalid request or business failure. Codes: INVALID_ID, NOT_FOUND
- `401` — Missing or invalid access token
- `403` — Not authorized
- `404` — Not found
- `429` — Too many requests
- `500` — Internal server error
