A merchant's resolved cancellation and change policy (public,)
const url = 'https://quikstik-core.fly.dev/merchants/example/policy?channel=direct';const options = {method: 'GET'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url 'https://quikstik-core.fly.dev/merchants/example/policy?channel=direct'Public, unauthenticated, resolved by merchant slug like the public content routes. Returns the
policy the merchant’s rules resolve to for a product and channel — most specific document wins
per rule: a channel document that governs → variant → offering → tenant → the built-in
default (refund_all, so an unconfigured merchant never retains money by accident). With no
query it is the tenant default for the policy page. Clients never resolve: this is the
resolved value.
configured is false when nothing backs the answer (basis: built_in_default) — a default is
never served as if the merchant had set it. basis: legacy_schedule means the merchant has
only its pre- T-minus schedule (a real, configured schedule). sources lists the
documents (scope and version) the answer came from.
200 carries Cache-Control: public, max-age=300. 404 unknown merchant; 422 a malformed
offering/variant/channel; 503 no backend.
Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”Query Parameters
Section titled “Query Parameters”Responses
Section titled “Responses”The resolved policy
object
object
The resolved rule set. Every field is present — nothing is left to inherit.
object
Tiers are most-notice-first; the most generous qualifying tier applies, else below.
object
object
One rule’s verdict. For a cancel, refund_all/no_refund/refund are the refund fraction; for a reschedule refund_all means a free change and no_refund means not allowed. ota_governed is produced by resolution for a booking whose channel governs it and is never stored in a document. refund carries bps; fee carries fee.
object
none as the inner fee of a fee outcome means “use the policy’s own fee”. flat carries minor + currency; percent carries bps; keep_deposit carries nothing.
object
object
object
One rule’s verdict. For a cancel, refund_all/no_refund/refund are the refund fraction; for a reschedule refund_all means a free change and no_refund means not allowed. ota_governed is produced by resolution for a booking whose channel governs it and is never stored in a document. refund carries bps; fee carries fee.
object
none as the inner fee of a fee outcome means “use the policy’s own fee”. flat carries minor + currency; percent carries bps; keep_deposit carries nothing.
object
One rule’s verdict. For a cancel, refund_all/no_refund/refund are the refund fraction; for a reschedule refund_all means a free change and no_refund means not allowed. ota_governed is produced by resolution for a booking whose channel governs it and is never stored in a document. refund carries bps; fee carries fee.
object
none as the inner fee of a fee outcome means “use the policy’s own fee”. flat carries minor + currency; percent carries bps; keep_deposit carries nothing.
object
none as the inner fee of a fee outcome means “use the policy’s own fee”. flat carries minor + currency; percent carries bps; keep_deposit carries nothing.
object
object
object
One rule’s verdict. For a cancel, refund_all/no_refund/refund are the refund fraction; for a reschedule refund_all means a free change and no_refund means not allowed. ota_governed is produced by resolution for a booking whose channel governs it and is never stored in a document. refund carries bps; fee carries fee.
object
none as the inner fee of a fee outcome means “use the policy’s own fee”. flat carries minor + currency; percent carries bps; keep_deposit carries nothing.
object
object
Rendering hints only; the full page renders from the rules.
object
True when the booking’s channel governs (verdicts are ota_governed).
object
Example
{ "basis": "documents", "scope": { "channel": "direct" }, "policy": { "cancel": { "below": { "kind": "refund_all", "fee": { "kind": "none", "currency": "USD" } } }, "reschedule": { "tiers": [ { "outcome": { "kind": "refund_all", "fee": { "kind": "none", "currency": "USD" } } } ], "below": { "kind": "refund_all", "fee": { "kind": "none", "currency": "USD" } } }, "fee": { "kind": "none", "currency": "USD" }, "refund_as": { "kind": "money" }, "weather": { "kind": "none", "outcome": "full_refund_or_rebook" }, "no_show": { "kind": "refund_all", "fee": { "kind": "none", "currency": "USD" } }, "operator_cancel": "refund_all", "overrides": { "waiver_reasons": [ "hardship" ] } }, "sources": [ { "scope_kind": "tenant" } ]}Headers
Section titled “Headers”Always public, max-age=300.
Unknown merchant
object
Stable, machine-readable reason code (e.g. “sold_out”, “processor_not_configured”, “rail_refused”).
Example
{ "reason": "sold_out"}invalid_offering, invalid_variant or invalid_channel.
object
Stable, machine-readable reason code (e.g. “sold_out”, “processor_not_configured”, “rail_refused”).
Example
{ "reason": "sold_out"}No durable backend is wired for this operation (fail-closed)
object
Stable, machine-readable reason code (e.g. “sold_out”, “processor_not_configured”, “rail_refused”).
Example
{ "reason": "sold_out"}