Quote and Policy Search
Partner guide for finding saved quotes, resuming quote inputs, and locating issued policies with cursor pagination.
The API exposes separate search families for pre-purchase quotes and issued policies:
| Goal | Operation | Use the result for |
|---|---|---|
| Find saved quote summaries | searchSavedQuotes | Search results, quote selection, and pagination |
| Load one saved quote | savedQuote | Resume form context and determine annual or single-trip flow |
| Refresh quote pricing | quote or annualPlanQuote | Current products, coverage choices, premium, and a current quote number |
| Find an issued policy | searchPlan | Policy lookup, servicing eligibility, payment history, and modification inputs |
Do not use saved-quote operations to service an issued policy. Do not treat a saved quote as proof of current price or product availability.
Search Design
Run searches from your backend and enforce object-level authorization before returning results. Agency number, quote number, plan number, transaction ID, names, email, phone, dates, and ZIP code are untrusted identifiers, not authorization evidence.
Prefer the narrowest known identifier:
- Use
quoteNumberfor a known quote. - Use
planNumberfor a known issued policy. - Use
transactionIdwithsearchPlanwhen tracing issued policies related to a known payment transaction. - Combine agency and customer attributes when the direct identifier is unknown.
- Return a selection screen when multiple records match; do not guess which record belongs to the user.
Find Saved Quotes
Request
query SearchSavedQuotes(
$quoteSearchRequest: QuoteSearchRequestInput!
$first: Int
$after: String
$last: Int
$before: String
) {
searchSavedQuotes(
quoteSearchRequest: $quoteSearchRequest
first: $first
after: $after
last: $last
before: $before
) {
totalCount
nodes {
quoteNumber
isAnnualQuote
planNumber
createDate
departureDate
returnDate
agencyNumber
agencyName
advisorName
residencyCountryIsoCode
residencyStateIsoCode
destinations {
countryIsoCode
destinationName
}
travelers {
firstName
lastName
email
isPrimary
tripCost
}
}
edges {
cursor
}
pageInfo {
startCursor
endCursor
hasPreviousPage
hasNextPage
}
}
}
Request example variables:
{
"quoteSearchRequest": {
"agencyNumber": "<authorized-agency-number>",
"email": "<customer-email>"
},
"first": 20,
"after": null
}
Quote Search Filters
Every field in QuoteSearchRequestInput is optional, but the request object itself is required.
| Filter | Search value | Typical use |
|---|---|---|
agencyNumber | Agency identifier | Scope results to the authorized partner agency |
quoteNumber | Saved quote identifier | Retrieve a known quote summary |
email | Traveler email | Locate quotes associated with a customer email |
firstName | Traveler first name | Refine customer search |
lastName | Traveler last name | Refine customer search |
departureDate | YYYY-MM-DD | Find quotes for a known trip start |
returnDate | YYYY-MM-DD | Find quotes for a known trip end |
Text matching and multi-filter behavior can vary by environment configuration. Do not present exact, partial, or case-sensitive matching as a user-facing guarantee unless that behavior is defined in your account contract and covered by representative tests.
Result Interpretation
isAnnualQuotetells you which quote mutation to use when refreshing the quote.planNumbercan indicate that a saved quote record is associated with an issued policy. UsesearchPlanfor policy servicing.totalCountis the count reported by the connection, not the number of nodes in the current page.- Request only fields required by the current screen. Traveler and trip fields contain personal data.
Load One Saved Quote
After the user selects a quote, retrieve its stored input context by quote number.
query GetSavedQuote($quoteNumber: String!) {
savedQuote(quoteNumber: $quoteNumber) {
quoteNumber
isAnnualQuote
quoteInput {
agencyNumber
agentId
applicationDate
residencyCountryIsoCode
residencyStateIsoCode
tripType
trip {
departureDate
depositDate
returnDate
destinations {
countryIsoCode
stateIsoCode
destinationId
destinationName
}
travelers {
id
primaryTraveler
firstName
lastName
email
dateOfBirth
tripCost
}
}
}
annualQuoteInput {
agencyNumber
agentId
applicationDate
effectiveDate
residencyCountryIsoCode
residencyStateIsoCode
tripType
travelers {
id
primaryTraveler
firstName
lastName
email
dateOfBirth
}
tripSegment {
departureDate
depositDate
returnDate
destinations {
countryIsoCode
stateIsoCode
destinationId
destinationName
}
travelers {
id
firstName
lastName
dateOfBirth
tripCost
}
}
}
quoteReminders {
first
second
third
}
}
}
Request example variables:
{
"quoteNumber": "<saved-quote-number>"
}
Use isAnnualQuote to choose the applicable branch:
false: usequoteInputto prefill the single-trip experience.true: useannualQuoteInputto prefill the annual experience.
Treat nullable branches as absent rather than manufacturing defaults. A saved quote is resumable input context, not a guaranteed current offer.
The query now retrieves the SDL-exposed dates, destinations, travelers, costs, primary-traveler flag, annual traveler configuration, and optional annual trip segment needed to prefill the documented review experience. Product selections and current prices are not exposed by SavedQuoteResults; refresh them with the applicable quote mutation before purchase or staging.
Resume and Re-Quote
Single-Trip Quote
- Load
savedQuote. - Prefill the form from
quoteInput. - Let the customer confirm or update dates, destinations, travelers, and costs.
- Call
quotewith the complete confirmed input. - Replace the stored checkout quote number with the new response
quoteNumber. - Select products and coverage IDs only from the new response.
The saved quote number identifies the stored record. After requoting, treat the new quoteNumber, products, coverage IDs, and prices as authoritative; do not continue with selections from the older quote.
See Single Trip Quote & Purchase for the quote selection and purchase handoffs.
Annual Quote
- Load
savedQuoteand verifyisAnnualQuoteistrue. - Prefill from
annualQuoteInput. - Keep traveler IDs stable while the customer reviews travelers and optional trip-segment data.
- Call
annualPlanQuotewith the complete confirmed input. - Replace the earlier quote number and product selection with the new response.
Keep traveler IDs associated with the same people while editing the resumed form. After requoting, the new quote number and returned product state replace the saved pricing context.
See Annual Plan Quote & Purchase.
Find Issued Policies
searchPlan returns detailed issued-plan records. Because its nodes can include traveler, payment, claim, document, history, and pricing data, request only fields needed for the authorized workflow.
Request
query SearchPlans(
$planSearchRequest: PlanSearchRequestInput!
$first: Int
$after: String
$last: Int
$before: String
) {
searchPlan(
planSearchRequest: $planSearchRequest
first: $first
after: $after
last: $last
before: $before
) {
totalCount
nodes {
planNumber
planStatus
planType
isActive
isAnnual
issueDate
effectiveDate
expirationDate
source
planPrimaryTraveler {
firstName
lastName
}
planProduct {
productCode
productName
}
planTripDetails {
departureDate
returnDate
}
segmentTripDetails {
policySegmentGuid
departureDate
returnDate
isModifyEnabled
}
planDocuments {
documentType
downloadLink
}
}
edges {
cursor
}
pageInfo {
startCursor
endCursor
hasPreviousPage
hasNextPage
}
}
}
The following example looks up an issued policy by plan number.
Request example variables:
{
"planSearchRequest": {
"agencyNumber": "<authorized-agency-number>",
"planNumber": "<issued-plan-number>",
"searchAllTravelers": false
},
"first": 10,
"after": null
}
Policy Search Filters
searchAllTravelers is the only required field inside PlanSearchRequestInput.
| Filter | Search value | Typical use |
|---|---|---|
agencyNumber | Agency identifier | Scope to the authorized agency |
planNumber | Issued policy identifier | Direct policy lookup |
transactionId | Payment transaction identifier | Find issued policies related to a known transaction |
groupNumber | Integer group identifier | Group-policy lookup |
tourNumber | Tour or booking context | Locate plans associated with a tour |
departureDate | YYYY-MM-DD | Match trip departure |
returnDate | YYYY-MM-DD | Match trip return |
issueStartDate | YYYY-MM-DD | Lower boundary for policy issue date |
issueEndDate | YYYY-MM-DD | Upper boundary for policy issue date |
traveler.firstName | Traveler first name | Traveler identity search |
traveler.lastName | Traveler last name | Traveler identity search |
traveler.email | Traveler email | Traveler identity search |
traveler.phoneNumber | Traveler phone | Traveler identity search |
traveler.address.zipCode | Traveler postal code | Refine identity search |
searchAllTravelers | Boolean | Required traveler-search control |
strictSearch | Boolean | Optional match-mode control |
filterBy | Integer | Optional server-defined filter or sort control |
isSortBy | Boolean | Optional server-defined filter or sort control |
Transaction-based policy lookup is supported only by searchPlan. It is not a filter for searchSavedQuotes or savedQuote. A matching transaction identifies candidate issued policies but does not establish that the caller is authorized to view or service them.
Use searchAllTravelers, strictSearch, filterBy, and isSortBy only when their allowed values and semantics are defined in your account contract. Do not expose guessed labels or behavior in a production UI; test representative records before release.
Choose Result Fields by Workflow
| Workflow | Useful result fields |
|---|---|
| Customer policy lookup | planNumber, status, dates, primary traveler, product |
| Modification eligibility | isAnnual, isActive, planTripDetails, segmentTripDetails.isModifyEnabled |
| Annual segment modification | segmentTripDetails.policySegmentGuid and segment details |
| Payment support | planPaymentDetails and transaction history, with restricted authorization |
| Document retrieval | planDocuments, with authorized delivery controls |
| Claims support | claimDetails, with role-based access and minimal display |
Do not return full plan nodes to every client merely because the schema permits it.
Cursor Pagination
Both search operations support Relay-style forward and backward pagination.
Forward
- Send
firstwith noafterfor the first page. - Read
pageInfo.hasNextPage. - When true, send the prior
pageInfo.endCursorasafter.
{
"first": 20,
"after": "<previous-end-cursor>"
}
Backward
- Send
lastand a knownbeforecursor. - Read
pageInfo.hasPreviousPage. - Use
pageInfo.startCursoras the nextbeforevalue when moving backward.
Do not send both pagination directions for one navigation action. Cursors are opaque: store and replay them exactly, and do not parse or construct them. Use the default and maximum page sizes assigned to your environment.
No Results, Multiple Results, and Errors
- No results: allow the user to verify inputs; do not reveal whether an unauthorized record exists.
- Multiple results: show the minimum attributes needed to choose safely, then load the selected record.
- Invalid cursor: restart from the first page rather than editing the cursor.
- Unauthorized scope: fail closed and log a non-sensitive audit event.
- Transient API failure: retry reads with bounded backoff; do not broaden filters automatically.
Security and Privacy
- Authorize every quote or policy object after search and before detail display.
- Restrict transaction, claim, payment, and document fields by support role and business purpose.
- Mask names, emails, phone numbers, addresses, dates of birth, and transaction IDs in logs.
- Do not place production identifiers or personal data in URLs, analytics events, screenshots, or sample payloads.
- Apply rate limits and monitoring to customer-enumeration search paths.