Get a quote
GET/v1/quotes/{quoteId}
Returns one quote with everything the quote editor shows: its mode (a package quote with upgrade packages, or a per_item basket), lines, packages, bill totals, status and decision, whether it changed since it was sent, the customer's engagement with the public page, the public link and your metadata. Money is a decimal string in totals.currency.
Permissions: quotes:read · Kind: read · Cost: 1 unit · MCP tool get_quote
Path parameters
| Field | Type | Required | Description |
|---|---|---|---|
quoteId |
uuid | yes |
Query parameters
None.
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
object |
"quote" | yes | |
id |
uuid | yes | |
tripId |
uuid | yes | |
code |
string | yes | |
name |
string | yes | |
mode |
"package" | "per_item" | yes | |
status |
"draft" | "sent" | "accepted" | "rejected" | "expired" | "superseded" | yes | |
travelers |
integer | yes | |
marginPct |
number | yes | |
finalPriceOverride |
string | null | yes | |
validUntil |
string | null | yes | |
ctaUrl |
string | null | yes | |
templateId |
string | null | yes | |
packages |
object[] | yes | |
packages[].id |
string | yes | |
packages[].name |
string | yes | |
lines |
object | object | object[] | yes | |
totals |
object | yes | |
totals.currency |
"EUR" | yes | |
totals.net |
string | yes | |
totals.marginAmount |
string | yes | |
totals.total |
string | yes | |
totals.finalPrice |
string | yes | |
totals.perPax |
string | yes | |
totals.finalMargin |
string | yes | |
totals.packages |
object[] | yes | |
totals.packages[].id |
string | yes | |
totals.packages[].name |
string | yes | |
totals.packages[].deltaNet |
string | yes | |
totals.packages[].deltaPvp |
string | yes | |
totals.packages[].lineIds |
string[] | yes | |
textOverrides |
object | yes | |
imageOverrides |
object | yes | |
sentAt |
string | null | yes | |
modifiedSinceSent |
boolean | yes | |
acceptedAt |
string | null | yes | |
acceptedVia |
"prospect_link" | "agent" | null | yes | |
acceptedPackageId |
string | null | yes | |
acceptedLineIds |
string[] | yes | |
acceptance |
object | null | yes | What the customer typed when accepting on the quote page — personal data: present only for a key holding travelers:read, only on quote reads (a write's response carries null; read the quote), and every such read is audited. |
acceptance.name |
string | null | yes | |
acceptance.email |
string | null | yes | |
acceptance.phone |
string | null | yes | |
acceptance.message |
string | null | yes | |
engagement |
object | yes | |
engagement.views |
integer | yes | |
engagement.uniqueSessions |
integer | yes | |
engagement.activeSeconds |
integer | yes | |
engagement.ctaClicks |
integer | yes | |
engagement.maxScrollPct |
number | yes | |
engagement.sectionsSeen |
integer | yes | |
engagement.interactions |
integer | yes | |
engagement.lastSeenAt |
string | null | yes | |
engagement.lastCtaAt |
string | null | yes | |
metadata |
object | yes | |
appUrl |
string | null | yes | |
publicUrl |
string | null | yes | |
createdAt |
string | yes | |
updatedAt |
string | yes |
Errors
Errors are problem details. Besides the refusals described above, any call like this one can return:
invalid_request— Invalid requestunauthorized— Missing or invalid API keyinsufficient_scope— Missing permissionrate_limited— Rate limit reachednot_found— Not found