Cancellations & refunds
Cancel with the book response's supplier_reference, unchanged. Only the account that made the booking can
cancel it (404 booking_not_found otherwise). A modified supplier_reference answers 422 invalid_booking_token.
reason is optional free text, forwarded to providers that accept one.
/v1/transfer/cancel{
"provider_context": {"provider": "provider_a"},
"supplier_reference": {
"booking_id": "01aa00bb11cc22dd33ee44ff55667781",
"confirmation_number": "PRV0000001",
"provider": "provider_a",
"booking_status": "completed",
"booking_token": "bt1.gAAAAAB..."
},
"reason": "Customer request"
}
Handling the outcome
status | What to do |
|---|---|
cancelled | Final. Mark the booking cancelled and store the cancel response (pass it as cancel_response to booking details later). |
cancellation_pending | The provider accepted the request but confirms later. Show "cancellation in progress" and poll booking details (below). Do not send cancel again. |
failed | The booking is not cancelled; read error. A booking past its pickup time, already cancelled or completed cannot be cancelled. Check booking details before trying again. |
unknown | The provider did not answer in time (cancel_outcome_unknown). Check booking details; cancel again only if the booking is still confirmed or pending. |
A timeout or 5xx also leaves the result unknown: check booking details first. Cancelling a booking that we have
already cancelled returns the stored response (Idempotent-Replayed: true) without contacting the provider again.
Pending cancellations
Some providers accept cancellations asynchronously: cancel answers cancellation_pending with cancelled: false.
It normally completes within minutes.
- Call booking details with
supplier_reference(and thecancel_responseyou received). - Repeat every 2 to 5 minutes until
booking_details.booking.statusiscancelled. - Then read
booking_details.cancellationforcancelled_atand the refund. - Still pending after one hour? Contact support with the booking reference.
Refunds
The refund we report is information: it does not move money. Settle refunds according to your agreement with Pathfndr. Refunds are always reported in the currency of the booking.
refund_source | How the amount is determined |
|---|---|
supplier | Reported by the provider: the amount paid minus any non-refundable part under the policy |
policy_estimate | Computed from the free-cancellation deadline when the provider reports no amount: full refund before the deadline, 0 after. refund_estimated is true. |
null | No amount reported and no deadline known. Use the offer's cancellation.policy_text. |
The deadline is pickup-local (free cancellation until N hours before pickup, in the pickup's time zone).
booking_details.cancellation.free_cancellation_until shows it with its UTC offset.
{
"status": "cancelled",
"cancelled": true,
"refund_amount": 400.0,
"currency": "EUR",
"refund_source": "policy_estimate",
"refund_estimated": true,
"cancelled_at": "2026-10-23T06:37:22+00:00",
"cancelled_at_source": "tp_cancel",
"error": null
}
{
"status": "cancellation_pending",
"cancelled": false,
"refund_amount": null,
"currency": null,
"refund_source": null,
"refund_estimated": false,
"cancelled_at": null,
"cancelled_at_source": null,
"error": null
}
Round trips and multi-leg bookings
Each leg is a separate booking with its own supplier_reference: cancel each leg separately. A round trip booked
as one round_trip offer is cancelled as a whole.