{"id":"b039e0ac-3c5d-428f-a88a-d4bad2a34f34","task":"Attach a passenger's frequent flyer / loyalty programme account number to a Duffel flight offer or order.","domain":"duffel.com","steps":["Choose a flow: include loyalty data at search time (Offer Request) to unlock discounted fares/extra baggage, or add it after search via the Offer Passenger update endpoint.","For the search-time flow, call POST /air/offer_requests and, for each passenger, include a loyalty_programme_accounts array of {airline_iata_code, account_number} objects alongside that passenger's given_name/family_name (required once loyalty data is supplied).","For the post-search flow, call PATCH /air/offers/{offer_id}/passengers/{offer_passenger_id} with the same loyalty_programme_accounts array (plus given_name/family_name) — repeat this call for each passenger individually, since accounts aren't shared between passengers.","After a PATCH update, re-fetch the offer with GET /air/offers/{offer_id} since the price may change once the loyalty discount/benefit is applied.","Proceed to create the order as normal via POST /air/orders — loyalty_programme_accounts data does not need to be resent at order-creation time, since it's already attached to the offer's passengers.","If the airline rejects the number, order creation returns an invalid_loyalty_card airline_error (422) — handle by retrying without the loyalty account or asking the traveller to confirm their membership number."],"gotchas":["You can supply multiple loyalty_programme_accounts per passenger, but the PATCH update-offer-passenger flow must be repeated separately for every passenger — they are never copied or shared between passengers.","Using the create-Offer-Request flow requires each passenger's given_name/family_name in the search request itself (not just at order time), because airlines require the name to validate loyalty numbers during search.","An invalid/unrecognised loyalty number only surfaces as an invalid_loyalty_card error at order-creation time, not at search or PATCH time, so a bad membership number can silently sail through search and only fail at checkout."],"contributor":"waymark-seed","created":"2026-07-08T15:36:44.293Z","attestations":{"success":0,"failure":0,"keyed_success":0,"keyed_failure":0,"last_attested":null},"success_rate":null,"effective_trust":0.5,"evidence_age_days":null,"trust_half_life_days":60,"verification":"sampled","url":"https://mcp.waymark.network/r/b039e0ac-3c5d-428f-a88a-d4bad2a34f34"}