List a trip's quotes
GET/v1/trips/{tripId}/quotes
Lists one trip's quotes, as the quote editor's tabs show them — the same filters as GET /quotes. Another agency's trip, an archived one and a catalog working copy are a 404.
Permissions: quotes:read · Kind: read · Cost: 1 unit
Path parameters
| Field | Type | Required | Description |
|---|---|---|---|
tripId |
uuid | yes |
Query parameters
| Field | Type | Required | Description |
|---|---|---|---|
limit |
integer | 1–100, default 25 | |
cursor |
string | max 500 chars | |
sort |
"updatedAt" | "-updatedAt" | "createdAt" | "-createdAt" | default "-updatedAt" | |
status |
"draft" | "sent" | "accepted" | "rejected" | "expired" | "superseded" | ||
updatedSince |
datetime | ||
acceptedSince |
datetime | Only quotes accepted at or after this instant — the 'quote accepted' polling trigger. | |
metadata |
object |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
object |
"list" | yes | |
data |
object[] | yes | |
data[].object |
"quote" | yes | |
data[].id |
uuid | yes | |
data[].tripId |
uuid | yes | |
data[].code |
string | yes | |
data[].name |
string | yes | |
data[].mode |
"package" | "per_item" | yes | |
data[].status |
"draft" | "sent" | "accepted" | "rejected" | "expired" | "superseded" | yes | |
data[].travelers |
integer | yes | |
data[].marginPct |
number | yes | |
data[].finalPriceOverride |
string | null | yes | |
data[].validUntil |
string | null | yes | |
data[].ctaUrl |
string | null | yes | |
data[].templateId |
string | null | yes | |
data[].packages |
object[] | yes | |
data[].packages[].id |
string | yes | |
data[].packages[].name |
string | yes | |
data[].lines |
object | object | object[] | yes | |
data[].totals |
object | yes | |
data[].totals.currency |
"EUR" | yes | |
data[].totals.net |
string | yes | |
data[].totals.marginAmount |
string | yes | |
data[].totals.total |
string | yes | |
data[].totals.finalPrice |
string | yes | |
data[].totals.perPax |
string | yes | |
data[].totals.finalMargin |
string | yes | |
data[].totals.packages |
object[] | yes | |
data[].textOverrides |
object | yes | |
data[].imageOverrides |
object | yes | |
data[].sentAt |
string | null | yes | |
data[].modifiedSinceSent |
boolean | yes | |
data[].acceptedAt |
string | null | yes | |
data[].acceptedVia |
"prospect_link" | "agent" | null | yes | |
data[].acceptedPackageId |
string | null | yes | |
data[].acceptedLineIds |
string[] | yes | |
data[].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. |
data[].acceptance.name |
string | null | yes | |
data[].acceptance.email |
string | null | yes | |
data[].acceptance.phone |
string | null | yes | |
data[].acceptance.message |
string | null | yes | |
data[].engagement |
object | yes | |
data[].engagement.views |
integer | yes | |
data[].engagement.uniqueSessions |
integer | yes | |
data[].engagement.activeSeconds |
integer | yes | |
data[].engagement.ctaClicks |
integer | yes | |
data[].engagement.maxScrollPct |
number | yes | |
data[].engagement.sectionsSeen |
integer | yes | |
data[].engagement.interactions |
integer | yes | |
data[].engagement.lastSeenAt |
string | null | yes | |
data[].engagement.lastCtaAt |
string | null | yes | |
data[].metadata |
object | yes | |
data[].appUrl |
string | null | yes | |
data[].publicUrl |
string | null | yes | |
data[].createdAt |
string | yes | |
data[].updatedAt |
string | yes | |
nextCursor |
string | null | 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