Retrieve a quote
Operation ID: getQuote
Group: CRM › Quotes
Open in the interactive reference
GET /crm/quotes/{id}
Read-only: Reads and returns; changes nothing.
Retrieves a quote. Both this endpoint and POST crm/quotes/search return the whole quote. The header comes with subscriptions[], the subscriptions on the quote, and nonRecurringProducts[], the products that belong to no subscription. The products under a subscription are in subscriptions[].quoteProducts[], and both product sets share the same schema. GET crm/quotes returns the header alone. Every amount in the response is in the quote's currency.
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 quote you want to retrieve. Example: "3b7d5e9c-1a24-4f80-9c6d-2e8f70b13a45". |
Response
200 Success
Under data (getQuoteOutput):
| Field | Type | Required | Description |
|---|---|---|---|
id |
string | yes | The unique identifier for the quote. Example: "3b7d5e9c-1a24-4f80-9c6d-2e8f70b13a45". |
quoteNumber |
string | no | The system-generated quote number, for example 'QT-1042'. Absent while none has been assigned. Example: "QT-1042". |
quoteType |
string | yes | The kind of quote. Possible values: 'new', 'upsell', 'renewal', 'changeOrder'. Example: "new". |
status |
string | no | Where the quote stands in its business process. Possible values: 'created', 'underApproval', 'approved', 'underSigning', 'signed', 'completed'. Absent on a quote that has not entered the process. Example: "approved". |
approvalStatus |
string | no | Where the quote stands in its approval process. Possible values: 'pendingSubmission', 'pendingApproval', 'approved', 'rejected'. Absent until the approval process has run. Example: "approved". |
isPrimary |
boolean | yes | Whether this is the primary quote of its opportunity. Example: true. |
quoteDate |
date | yes | The date the quote was drawn up. Format YYYY-MM-DD. Product prices are validated against the opportunity's price book as of this date. Example: "2026-08-01". |
serviceStartDate |
date | yes | The first date products or services on this quote are delivered. Format YYYY-MM-DD. No subscription on the quote starts before it. Example: "2026-09-01". |
signDate |
date | no | The date the quote was signed by the customer and the legal entity. Format YYYY-MM-DD. Absent when not recorded. Example: "2026-08-14". |
paymentTerm |
string | yes | The code of the payment term applied to invoices created from this quote. See code on GET accounting/payment-terms. Example: "NET30". |
memo |
string | no | A free-text memo recorded on the quote. Absent when none is set. Example: "Two-year platform subscription, renegotiated after the pilot.". |
needsPSACalculation |
boolean | no | Whether the quote takes its product data from a PSA project rather than from the product catalog. Example: false. |
currency |
string | no | The currency of every amount on the quote. A quote takes the currency of its opportunity and has none of its own. Format ISO 4217, for example 'USD'. Example: "USD". |
totalPrice |
decimal | no | The sum of the quote's lines before tax, less any one-time discount, in the quote's currency. Example: "48000.00". |
oneTimeDiscountAmount |
decimal | no | A one-time discount applied to the whole quote, in the quote's currency. Example: "2000.00". |
oneTimeDiscountAllocation |
string | no | How oneTimeDiscountAmount is spread across the quote's invoices. Possible values: 'firstInvoice', 'alignToInvoiceFrequency', 'custom'. Example: "firstInvoice". |
billableTimeEstimate |
decimal | no | The estimated total of the quote's billable-time lines, in the quote's currency. |
billableTimeCappedPrice |
decimal | no | The ceiling on the total of the quote's billable-time lines, in the quote's currency. |
opportunityId |
string | yes | The opportunity this quote belongs to. See id on GET crm/opportunities/:id. Example: "a1c4d7e0-5b62-4c19-8e73-9f0d2a6b4c88". |
opportunityName |
string | no | The name of the opportunity this quote belongs to. Absent when the opportunity has no name. Example: "Northwind — platform expansion". |
opportunityNumber |
string | no | The opportunity number of the opportunity this quote belongs to, for example 'OP-1042'. Absent while none has been assigned. Example: "OPP-2291". |
billToAddressId |
string | no | The bill-to address on the quote, a copy the quote keeps of its own rather than the source it was copied from. There is no endpoint for it. Example: "6f9a2b1c-33d4-4a55-9e21-0b7c8d4e1f02". |
soldToAddressId |
string | no | The sold-to address on the quote, a copy the quote keeps of its own rather than the source it was copied from. There is no endpoint for it. Example: "6f9a2b1c-33d4-4a55-9e21-0b7c8d4e1f02". |
salesArrangementId |
string | no | The sales arrangement this quote is assigned to. Set on change-order quotes. There is no endpoint for it. |
lastModifiedDate |
date-time | yes | The date and time the quote record last changed, in UTC. Format YYYY-MM-DDTHH:mm:ss.sssZ. Example: "2026-08-14T09:12:44.000Z". |
subscriptions |
array<object> | yes | The subscriptions on the quote, one per subscription, each with the products under it. An empty array when the quote has no recurring products. GET crm/quotes omits it and returns the quote header alone. Example: [{"id":"c2e1f4a7-8b90-4d33-9a15-6f7e8d2b0c41","termType":"termed","serviceStartDate":"2026-09-01","serviceEndDate":"2028-08-31","autoRenew":true,"renewalTerm":12,"quoteProducts":[{"id":"d4f2a1b8-3c67-4e05-8b92-1a7d0e6c5f38","quoteProductNumber":"QP-3","productId":"e5a3b2c9-4d78-4f16-9c03-2b8e1f7d6a49","productCode":"PLATFORM-ENT","productName":"Platform — Enterprise","isRampDeal":false,"orderIndex":1,"quoteProductLines":[{"id":"f6b4c3d0-5e89-4a27-8d14-3c9f2a8e7b50","quoteProductLineNumber":"QPL-7","productLineId":"a7c5d4e1-6f90-4b38-9e25-4d0a3b9f8c61","productLineName":"Enterprise seats","lineType":"recurring","quantity":"100.00","listPrice":"480.00","unitPrice":"400.00","discountPercentage":"0.166667","totalPrice":"40000.00","invoiceFrequency":"annually","priceModel":"tiered","pricingTerm":"annually","unitOfMeasure":"seat","serviceStartDate":"2026-09-01","serviceEndDate":"2028-08-31","orderIndex":1,"lineTiers":[{"id":"b8d6e5f2-7a01-4c49-8f36-5e1b4c0a9d72","fromQuantity":"1.00","toQuantity":"50.00","priceModel":"tiered","unitPrice":"440.00","listPrice":"480.00"},{"id":"c9e7f6a3-8b12-4d50-9a47-6f2c5d1b0e83","fromQuantity":"51.00","priceModel":"tiered","unitPrice":"400.00","listPrice":"480.00"}],"rateCardEntries":[],"invoiceMilestones":[]}]}]}]. |
subscriptions[].id |
string | yes | The unique identifier for the quote subscription. |
subscriptions[].termType |
string | yes | Whether the subscription runs to a fixed end date or renews indefinitely. Possible values: 'termed', 'evergreen'. |
subscriptions[].serviceStartDate |
date | yes | The first date the subscription delivers service. Format YYYY-MM-DD. Never earlier than the quote's serviceStartDate. |
subscriptions[].serviceEndDate |
date | no | The last date the subscription delivers service. Format YYYY-MM-DD. Set on a termed subscription and absent on an evergreen one. |
subscriptions[].autoRenew |
boolean | no | Whether the subscription renews automatically at the end of its term. |
subscriptions[].renewalTerm |
number | no | The renewal term in months. Meaningful only when autoRenew is true. |
subscriptions[].quoteProducts |
array<object> | yes | The products in this subscription, each with its priced lines. |
subscriptions[].quoteProducts[].id |
string | yes | The unique identifier for the quote product. |
subscriptions[].quoteProducts[].quoteProductNumber |
string | no | The system-assigned number of the quote product. Absent while none has been assigned. |
subscriptions[].quoteProducts[].productId |
string | no | The catalog product for this quote product. See id on GET accounting/products/:id. |
subscriptions[].quoteProducts[].productCode |
string | no | The code of that product in the catalog. |
subscriptions[].quoteProducts[].productName |
string | no | The name of that product in the catalog. |
subscriptions[].quoteProducts[].isRampDeal |
boolean | no | Whether this product is priced as a ramp deal, with quantities or prices stepping over time. |
subscriptions[].quoteProducts[].rampInterval |
string | no | How the ramp steps. Possible values: 'annually', 'specificDates'. Absent unless isRampDeal is true. |
subscriptions[].quoteProducts[].rampInvoiceTiming |
string | no | How a ramp deal is invoiced. Possible values: 'allAtOnce', 'perInterval'. Absent unless isRampDeal is true. |
subscriptions[].quoteProducts[].orderIndex |
number | no | The position of this product within the quote, for display ordering. |
subscriptions[].quoteProducts[].quoteProductLines |
array<object> | yes | The priced lines of this quote product. A product has at least one. |
subscriptions[].quoteProducts[].quoteProductLines[].id |
string | yes | The unique identifier for the quote product line. |
subscriptions[].quoteProducts[].quoteProductLines[].quoteProductLineNumber |
string | no | The system-assigned number of the quote product line. Absent while none has been assigned. |
subscriptions[].quoteProducts[].quoteProductLines[].productLineId |
string | no | The catalog product line this line was priced from. See id on GET accounting/product-lines/:id. |
subscriptions[].quoteProducts[].quoteProductLines[].productLineName |
string | no | The name of that catalog product line. |
subscriptions[].quoteProducts[].quoteProductLines[].parentQuoteProductLineId |
string | no | The parent line this line hangs off, as an allowance or overage line does. Absent on a top-level line. |
subscriptions[].quoteProducts[].quoteProductLines[].lineType |
string | yes | What this line charges for. Possible values: 'recurring', 'oneTime', 'commitWithOverage', 'payAsYouGo', 'usage', 'prepaid', 'billableTime', 'billableTravelExpense', 'billablePassThrough'. |
subscriptions[].quoteProducts[].quoteProductLines[].quantity |
decimal | no | The quantity on this line, as a count, not an amount. For a ramp deal the per-period quantity is on each ramp instead. |
subscriptions[].quoteProducts[].quoteProductLines[].listPrice |
decimal | no | The per-unit list price before discount, in the quote's currency. |
subscriptions[].quoteProducts[].quoteProductLines[].unitPrice |
decimal | no | The per-unit price after discount, in the quote's currency. |
subscriptions[].quoteProducts[].quoteProductLines[].discountAmount |
decimal | no | The per-unit discount, in the quote's currency. |
subscriptions[].quoteProducts[].quoteProductLines[].discountPercentage |
decimal | no | The per-unit discount, as a decimal fraction of listPrice. For example, 0.1 is 10%. It is not an amount. |
subscriptions[].quoteProducts[].quoteProductLines[].extendedListPrice |
decimal | no | The list price extended across the quantity, in the quote's currency. |
subscriptions[].quoteProducts[].quoteProductLines[].cappedPrice |
decimal | no | The ceiling on what this line may total, in the quote's currency. Set on billable-time lines. |
subscriptions[].quoteProducts[].quoteProductLines[].totalPrice |
decimal | no | The total for this line, in the quote's currency. |
subscriptions[].quoteProducts[].quoteProductLines[].annualRecurringRevenue |
decimal | no | The annualized recurring revenue attributed to this line, in the quote's currency. |
subscriptions[].quoteProducts[].quoteProductLines[].invoiceFrequency |
string | no | How often this line is invoiced. Possible values: 'monthly', 'biMonthly', 'quarterly', 'semiAnnually', 'annually', 'once', 'custom', 'template', 'milestone', 'allAtOnce', 'termEnd'. |
subscriptions[].quoteProducts[].quoteProductLines[].priceModel |
string | no | How the price is derived from quantity. Possible values: 'flat', 'perUnit', 'tiered', 'volume', 'stairstep', 'rateCard', 'thresholdBased'. For a tiered or volume model the bands are in lineTiers. For a rateCard model they are in rateCardEntries. |
subscriptions[].quoteProducts[].quoteProductLines[].pricingTerm |
string | no | The period the unit price is quoted for. Possible values: 'monthly', 'biMonthly', 'once', 'quarterly', 'semiAnnually', 'annually'. |
subscriptions[].quoteProducts[].quoteProductLines[].unitOfMeasure |
string | no | The unit the quantity is counted 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'. |
subscriptions[].quoteProducts[].quoteProductLines[].overConsumptionBehavior |
string | no | What happens when consumption exceeds a prepaid balance. Possible values: 'allowNegative', 'overage'. Set on prepaid lines. |
subscriptions[].quoteProducts[].quoteProductLines[].rolloverAtRenewal |
boolean | no | Whether an unused prepaid balance carries forward at renewal. Set on prepaid lines. |
subscriptions[].quoteProducts[].quoteProductLines[].serviceStartDate |
date | no | The first date this line delivers service. Format YYYY-MM-DD. Defaults to the quote's serviceStartDate. |
subscriptions[].quoteProducts[].quoteProductLines[].serviceEndDate |
date | no | The last date this line delivers service. Format YYYY-MM-DD. Absent while open-ended. |
subscriptions[].quoteProducts[].quoteProductLines[].orderIndex |
number | no | The position of this line within its quote product, for display ordering. |
subscriptions[].quoteProducts[].quoteProductLines[].lineTiers |
array<object> | yes | The tiered or volume pricing bands for this line, ordered by fromQuantity. An empty array unless priceModel is a banded model. |
subscriptions[].quoteProducts[].quoteProductLines[].lineTiers[].id |
string | yes | The unique identifier for the tier band. |
subscriptions[].quoteProducts[].quoteProductLines[].lineTiers[].fromQuantity |
decimal | yes | The lower bound of the band, inclusive. A quantity, not an amount. |
subscriptions[].quoteProducts[].quoteProductLines[].lineTiers[].toQuantity |
decimal | no | The upper bound of the band, inclusive. Absent on the open-ended top band. |
subscriptions[].quoteProducts[].quoteProductLines[].lineTiers[].priceModel |
string | yes | How this band prices. Possible values: 'flat', 'perUnit', 'tiered', 'volume', 'stairstep', 'rateCard', 'thresholdBased'. |
subscriptions[].quoteProducts[].quoteProductLines[].lineTiers[].unitPrice |
decimal | no | The per-unit price for this band after discount, in the quote's currency. |
subscriptions[].quoteProducts[].quoteProductLines[].lineTiers[].listPrice |
decimal | no | The per-unit list price for this band before discount, in the quote's currency. |
subscriptions[].quoteProducts[].quoteProductLines[].rateCardEntries |
array<object> | yes | The rate-card pricing for this line, one entry per billable component. An empty array unless priceModel is 'rateCard'. |
subscriptions[].quoteProducts[].quoteProductLines[].rateCardEntries[].id |
string | yes | The unique identifier for the rate-card entry. |
subscriptions[].quoteProducts[].quoteProductLines[].rateCardEntries[].identifier |
string | yes | The identifier of the entry, unique within its line. |
subscriptions[].quoteProducts[].quoteProductLines[].rateCardEntries[].description |
string | no | A label that distinguishes entries that otherwise have the same data. |
subscriptions[].quoteProducts[].quoteProductLines[].rateCardEntries[].billableComponentId |
string | no | The billable component this entry prices. Absent when it names none. There is no endpoint for it. |
subscriptions[].quoteProducts[].quoteProductLines[].rateCardEntries[].unitPrice |
decimal | no | The per-unit price after discount, in the quote's currency. |
subscriptions[].quoteProducts[].quoteProductLines[].rateCardEntries[].listPrice |
decimal | no | The per-unit list price before discount, in the quote's currency. |
subscriptions[].quoteProducts[].quoteProductLines[].rateCardEntries[].unitOfMeasure |
string | yes | The unit the price is quoted per. 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'. |
subscriptions[].quoteProducts[].quoteProductLines[].rateCardEntries[].quantity |
decimal | no | The quantity of billable units on this entry, as a count, not an amount. |
subscriptions[].quoteProducts[].quoteProductLines[].rateCardEntries[].usageType |
string | no | What the usage represents. Possible values: 'consumption', 'overage', 'thresholdCounter', 'payg'. |
subscriptions[].quoteProducts[].quoteProductLines[].rateCardEntries[].conversion |
decimal | no | The factor that converts usage units to billable units. For example, 0.1 when 1 gigabyte is 0.1 credits. It is a ratio, not an amount. |
subscriptions[].quoteProducts[].quoteProductLines[].rateCardEntries[].billableUnitOfMeasure |
string | no | The unit the entry is billed in, which may differ from unitOfMeasure. 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'. |
subscriptions[].quoteProducts[].quoteProductLines[].invoiceMilestones |
array<object> | yes | The invoice milestones for this line, when it is invoiced against milestones rather than on a frequency. An empty array otherwise. |
subscriptions[].quoteProducts[].quoteProductLines[].invoiceMilestones[].id |
string | yes | The unique identifier for the invoice milestone. |
subscriptions[].quoteProducts[].quoteProductLines[].invoiceMilestones[].description |
string | no | What the milestone covers, as recorded on the quote. |
subscriptions[].quoteProducts[].quoteProductLines[].invoiceMilestones[].totalPrice |
decimal | no | The amount invoiced at this milestone, in the quote's currency. |
subscriptions[].quoteProducts[].quoteProductLines[].invoiceMilestones[].percentage |
decimal | no | The share of the line total this milestone invoices as a percentage. For example, 25 is 25%. It is not an amount. |
subscriptions[].quoteProducts[].quoteProductLines[].invoiceMilestones[].projectedDate |
date | no | The date the milestone is expected to be reached. Format YYYY-MM-DD. |
nonRecurringProducts |
array<object> | yes | The products on the quote that belong to no subscription, such as one-time charges, billable time and pass-through expenses. An empty array when every product is under a subscription. GET crm/quotes omits it and returns the quote header alone. Example: [{"id":"d0f8a7b4-9c23-4e61-8b58-7a3d6e2c1f94","quoteProductNumber":"QP-4","productId":"e1a9b8c5-0d34-4f72-9c69-8b4e7f3d2a05","productCode":"ONBOARD","productName":"Onboarding","orderIndex":2,"quoteProductLines":[{"id":"f2b0c9d6-1e45-4a83-8d70-9c5f8a4e3b16","productLineId":"a3c1d0e7-2f56-4b94-9e81-0d6a9b5f4c27","productLineName":"Implementation","lineType":"oneTime","quantity":"1.00","listPrice":"10000.00","unitPrice":"10000.00","totalPrice":"10000.00","invoiceFrequency":"milestone","priceModel":"flat","unitOfMeasure":"each","lineTiers":[],"rateCardEntries":[],"invoiceMilestones":[{"id":"b4d2e1f8-3a67-4c05-9f92-1e7b0c6d5a38","description":"Kick-off","totalPrice":"5000.00","percentage":"50.0000","projectedDate":"2026-09-15"}]}]}]. |
nonRecurringProducts[].id |
string | yes | The unique identifier for the quote product. |
nonRecurringProducts[].quoteProductNumber |
string | no | The system-assigned number of the quote product. Absent while none has been assigned. |
nonRecurringProducts[].productId |
string | no | The catalog product for this quote product. See id on GET accounting/products/:id. |
nonRecurringProducts[].productCode |
string | no | The code of that product in the catalog. |
nonRecurringProducts[].productName |
string | no | The name of that product in the catalog. |
nonRecurringProducts[].isRampDeal |
boolean | no | Whether this product is priced as a ramp deal, with quantities or prices stepping over time. |
nonRecurringProducts[].rampInterval |
string | no | How the ramp steps. Possible values: 'annually', 'specificDates'. Absent unless isRampDeal is true. |
nonRecurringProducts[].rampInvoiceTiming |
string | no | How a ramp deal is invoiced. Possible values: 'allAtOnce', 'perInterval'. Absent unless isRampDeal is true. |
nonRecurringProducts[].orderIndex |
number | no | The position of this product within the quote, for display ordering. |
nonRecurringProducts[].quoteProductLines |
array<object> | yes | The priced lines of this quote product. A product has at least one. |
nonRecurringProducts[].quoteProductLines[].id |
string | yes | The unique identifier for the quote product line. |
nonRecurringProducts[].quoteProductLines[].quoteProductLineNumber |
string | no | The system-assigned number of the quote product line. Absent while none has been assigned. |
nonRecurringProducts[].quoteProductLines[].productLineId |
string | no | The catalog product line this line was priced from. See id on GET accounting/product-lines/:id. |
nonRecurringProducts[].quoteProductLines[].productLineName |
string | no | The name of that catalog product line. |
nonRecurringProducts[].quoteProductLines[].parentQuoteProductLineId |
string | no | The parent line this line hangs off, as an allowance or overage line does. Absent on a top-level line. |
nonRecurringProducts[].quoteProductLines[].lineType |
string | yes | What this line charges for. Possible values: 'recurring', 'oneTime', 'commitWithOverage', 'payAsYouGo', 'usage', 'prepaid', 'billableTime', 'billableTravelExpense', 'billablePassThrough'. |
nonRecurringProducts[].quoteProductLines[].quantity |
decimal | no | The quantity on this line, as a count, not an amount. For a ramp deal the per-period quantity is on each ramp instead. |
nonRecurringProducts[].quoteProductLines[].listPrice |
decimal | no | The per-unit list price before discount, in the quote's currency. |
nonRecurringProducts[].quoteProductLines[].unitPrice |
decimal | no | The per-unit price after discount, in the quote's currency. |
nonRecurringProducts[].quoteProductLines[].discountAmount |
decimal | no | The per-unit discount, in the quote's currency. |
nonRecurringProducts[].quoteProductLines[].discountPercentage |
decimal | no | The per-unit discount, as a decimal fraction of listPrice. For example, 0.1 is 10%. It is not an amount. |
nonRecurringProducts[].quoteProductLines[].extendedListPrice |
decimal | no | The list price extended across the quantity, in the quote's currency. |
nonRecurringProducts[].quoteProductLines[].cappedPrice |
decimal | no | The ceiling on what this line may total, in the quote's currency. Set on billable-time lines. |
nonRecurringProducts[].quoteProductLines[].totalPrice |
decimal | no | The total for this line, in the quote's currency. |
nonRecurringProducts[].quoteProductLines[].annualRecurringRevenue |
decimal | no | The annualized recurring revenue attributed to this line, in the quote's currency. |
nonRecurringProducts[].quoteProductLines[].invoiceFrequency |
string | no | How often this line is invoiced. Possible values: 'monthly', 'biMonthly', 'quarterly', 'semiAnnually', 'annually', 'once', 'custom', 'template', 'milestone', 'allAtOnce', 'termEnd'. |
nonRecurringProducts[].quoteProductLines[].priceModel |
string | no | How the price is derived from quantity. Possible values: 'flat', 'perUnit', 'tiered', 'volume', 'stairstep', 'rateCard', 'thresholdBased'. For a tiered or volume model the bands are in lineTiers. For a rateCard model they are in rateCardEntries. |
nonRecurringProducts[].quoteProductLines[].pricingTerm |
string | no | The period the unit price is quoted for. Possible values: 'monthly', 'biMonthly', 'once', 'quarterly', 'semiAnnually', 'annually'. |
nonRecurringProducts[].quoteProductLines[].unitOfMeasure |
string | no | The unit the quantity is counted 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'. |
nonRecurringProducts[].quoteProductLines[].overConsumptionBehavior |
string | no | What happens when consumption exceeds a prepaid balance. Possible values: 'allowNegative', 'overage'. Set on prepaid lines. |
nonRecurringProducts[].quoteProductLines[].rolloverAtRenewal |
boolean | no | Whether an unused prepaid balance carries forward at renewal. Set on prepaid lines. |
nonRecurringProducts[].quoteProductLines[].serviceStartDate |
date | no | The first date this line delivers service. Format YYYY-MM-DD. Defaults to the quote's serviceStartDate. |
nonRecurringProducts[].quoteProductLines[].serviceEndDate |
date | no | The last date this line delivers service. Format YYYY-MM-DD. Absent while open-ended. |
nonRecurringProducts[].quoteProductLines[].orderIndex |
number | no | The position of this line within its quote product, for display ordering. |
nonRecurringProducts[].quoteProductLines[].lineTiers |
array<object> | yes | The tiered or volume pricing bands for this line, ordered by fromQuantity. An empty array unless priceModel is a banded model. |
nonRecurringProducts[].quoteProductLines[].lineTiers[].id |
string | yes | The unique identifier for the tier band. |
nonRecurringProducts[].quoteProductLines[].lineTiers[].fromQuantity |
decimal | yes | The lower bound of the band, inclusive. A quantity, not an amount. |
nonRecurringProducts[].quoteProductLines[].lineTiers[].toQuantity |
decimal | no | The upper bound of the band, inclusive. Absent on the open-ended top band. |
nonRecurringProducts[].quoteProductLines[].lineTiers[].priceModel |
string | yes | How this band prices. Possible values: 'flat', 'perUnit', 'tiered', 'volume', 'stairstep', 'rateCard', 'thresholdBased'. |
nonRecurringProducts[].quoteProductLines[].lineTiers[].unitPrice |
decimal | no | The per-unit price for this band after discount, in the quote's currency. |
nonRecurringProducts[].quoteProductLines[].lineTiers[].listPrice |
decimal | no | The per-unit list price for this band before discount, in the quote's currency. |
nonRecurringProducts[].quoteProductLines[].rateCardEntries |
array<object> | yes | The rate-card pricing for this line, one entry per billable component. An empty array unless priceModel is 'rateCard'. |
nonRecurringProducts[].quoteProductLines[].rateCardEntries[].id |
string | yes | The unique identifier for the rate-card entry. |
nonRecurringProducts[].quoteProductLines[].rateCardEntries[].identifier |
string | yes | The identifier of the entry, unique within its line. |
nonRecurringProducts[].quoteProductLines[].rateCardEntries[].description |
string | no | A label that distinguishes entries that otherwise have the same data. |
nonRecurringProducts[].quoteProductLines[].rateCardEntries[].billableComponentId |
string | no | The billable component this entry prices. Absent when it names none. There is no endpoint for it. |
nonRecurringProducts[].quoteProductLines[].rateCardEntries[].unitPrice |
decimal | no | The per-unit price after discount, in the quote's currency. |
nonRecurringProducts[].quoteProductLines[].rateCardEntries[].listPrice |
decimal | no | The per-unit list price before discount, in the quote's currency. |
nonRecurringProducts[].quoteProductLines[].rateCardEntries[].unitOfMeasure |
string | yes | The unit the price is quoted per. 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'. |
nonRecurringProducts[].quoteProductLines[].rateCardEntries[].quantity |
decimal | no | The quantity of billable units on this entry, as a count, not an amount. |
nonRecurringProducts[].quoteProductLines[].rateCardEntries[].usageType |
string | no | What the usage represents. Possible values: 'consumption', 'overage', 'thresholdCounter', 'payg'. |
nonRecurringProducts[].quoteProductLines[].rateCardEntries[].conversion |
decimal | no | The factor that converts usage units to billable units. For example, 0.1 when 1 gigabyte is 0.1 credits. It is a ratio, not an amount. |
nonRecurringProducts[].quoteProductLines[].rateCardEntries[].billableUnitOfMeasure |
string | no | The unit the entry is billed in, which may differ from unitOfMeasure. 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'. |
nonRecurringProducts[].quoteProductLines[].invoiceMilestones |
array<object> | yes | The invoice milestones for this line, when it is invoiced against milestones rather than on a frequency. An empty array otherwise. |
nonRecurringProducts[].quoteProductLines[].invoiceMilestones[].id |
string | yes | The unique identifier for the invoice milestone. |
nonRecurringProducts[].quoteProductLines[].invoiceMilestones[].description |
string | no | What the milestone covers, as recorded on the quote. |
nonRecurringProducts[].quoteProductLines[].invoiceMilestones[].totalPrice |
decimal | no | The amount invoiced at this milestone, in the quote's currency. |
nonRecurringProducts[].quoteProductLines[].invoiceMilestones[].percentage |
decimal | no | The share of the line total this milestone invoices as a percentage. For example, 25 is 25%. It is not an amount. |
nonRecurringProducts[].quoteProductLines[].invoiceMilestones[].projectedDate |
date | no | The date the milestone is expected to be reached. Format YYYY-MM-DD. |
{
"data": {
"id": "3b7d5e9c-1a24-4f80-9c6d-2e8f70b13a45",
"quoteNumber": "QT-1042",
"quoteType": "new",
"status": "approved",
"approvalStatus": "approved",
"isPrimary": true,
"quoteDate": "2026-08-01",
"serviceStartDate": "2026-09-01",
"signDate": "2026-08-14",
"paymentTerm": "NET30",
"memo": "Two-year platform subscription, renegotiated after the pilot.",
"needsPSACalculation": false,
"currency": "USD",
"totalPrice": "48000.00",
"oneTimeDiscountAmount": "2000.00",
"oneTimeDiscountAllocation": "firstInvoice",
"billableTimeEstimate": "19.99",
"billableTimeCappedPrice": "19.99",
"opportunityId": "a1c4d7e0-5b62-4c19-8e73-9f0d2a6b4c88",
"opportunityName": "Northwind — platform expansion",
"opportunityNumber": "OPP-2291",
"billToAddressId": "6f9a2b1c-33d4-4a55-9e21-0b7c8d4e1f02",
"soldToAddressId": "6f9a2b1c-33d4-4a55-9e21-0b7c8d4e1f02",
"salesArrangementId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"lastModifiedDate": "2026-08-14T09:12:44.000Z",
"subscriptions": [
{
"id": "c2e1f4a7-8b90-4d33-9a15-6f7e8d2b0c41",
"termType": "termed",
"serviceStartDate": "2026-09-01",
"serviceEndDate": "2028-08-31",
"autoRenew": true,
"renewalTerm": 12,
"quoteProducts": [
{
"id": "d4f2a1b8-3c67-4e05-8b92-1a7d0e6c5f38",
"quoteProductNumber": "QP-3",
"productId": "e5a3b2c9-4d78-4f16-9c03-2b8e1f7d6a49",
"productCode": "PLATFORM-ENT",
"productName": "Platform — Enterprise",
"isRampDeal": false,
"orderIndex": 1,
"quoteProductLines": [
{
"id": "f6b4c3d0-5e89-4a27-8d14-3c9f2a8e7b50",
"quoteProductLineNumber": "QPL-7",
"productLineId": "a7c5d4e1-6f90-4b38-9e25-4d0a3b9f8c61",
"productLineName": "Enterprise seats",
"lineType": "recurring",
"quantity": "100.00",
"listPrice": "480.00",
"unitPrice": "400.00",
"discountPercentage": "0.166667",
"totalPrice": "40000.00",
"invoiceFrequency": "annually",
"priceModel": "tiered",
"pricingTerm": "annually",
"unitOfMeasure": "seat",
"serviceStartDate": "2026-09-01",
"serviceEndDate": "2028-08-31",
"orderIndex": 1,
"lineTiers": [
{
"id": "b8d6e5f2-7a01-4c49-8f36-5e1b4c0a9d72",
"fromQuantity": "1.00",
"toQuantity": "50.00",
"priceModel": "tiered",
"unitPrice": "440.00",
"listPrice": "480.00"
},
{
"id": "c9e7f6a3-8b12-4d50-9a47-6f2c5d1b0e83",
"fromQuantity": "51.00",
"priceModel": "tiered",
"unitPrice": "400.00",
"listPrice": "480.00"
}
],
"rateCardEntries": [],
"invoiceMilestones": []
}
]
}
]
}
],
"nonRecurringProducts": [
{
"id": "d0f8a7b4-9c23-4e61-8b58-7a3d6e2c1f94",
"quoteProductNumber": "QP-4",
"productId": "e1a9b8c5-0d34-4f72-9c69-8b4e7f3d2a05",
"productCode": "ONBOARD",
"productName": "Onboarding",
"orderIndex": 2,
"quoteProductLines": [
{
"id": "f2b0c9d6-1e45-4a83-8d70-9c5f8a4e3b16",
"productLineId": "a3c1d0e7-2f56-4b94-9e81-0d6a9b5f4c27",
"productLineName": "Implementation",
"lineType": "oneTime",
"quantity": "1.00",
"listPrice": "10000.00",
"unitPrice": "10000.00",
"totalPrice": "10000.00",
"invoiceFrequency": "milestone",
"priceModel": "flat",
"unitOfMeasure": "each",
"lineTiers": [],
"rateCardEntries": [],
"invoiceMilestones": [
{
"id": "b4d2e1f8-3a67-4c05-9f92-1e7b0c6d5a38",
"description": "Kick-off",
"totalPrice": "5000.00",
"percentage": "50.0000",
"projectedDate": "2026-09-15"
}
]
}
]
}
]
},
"diagnostics": [
{
"code": "<code>",
"message": "<message>",
"severity": "error",
"path": [
"<path>"
],
"details": "<details>"
}
]
}
Errors
| Code | Status |
|---|---|
NOT_FOUND |
400 |
Statuses
400— Invalid request or business failure. Codes: 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