Shape
Two independent axes, each with an allow and a deny list:payment_methods names individual method codes — the same codes the methods endpoint returns. payment_method_categories names families, and a family covers every method inside it, including ones added to the catalogue later.
On a hosted checkout, these keys sit alongside country_code and phone in the same restriction object and are independent of them.
How it resolves
- A denied value wins, on either axis. Nothing overrides a deny.
- With no allow list on either axis, everything that is not denied stays usable.
- Otherwise the method must appear on one of the two allow lists — the axes are a union, not an intersection.
payment_methods.allow: ["card"] together with payment_method_categories.allow: ["mobile_money"] offers cards and all mobile money, not their overlap.
Rule 1 means a contradiction resolves to a refusal: allowing momo_mtn while denying the mobile_money category leaves MTN unusable. That case is caught at creation rather than at payment time — see Rejected at creation.
Refusing one thing
The common case is excluding a family. Deny the category, not the code:card code would only exclude one of the card methods; card_cb and card_kr would still be offered wherever they are routed. The category covers all three.
Categories
Do not hard-code the membership of a category. It is the catalogue’s business, and it grows.
What it affects
A restriction is applied everywhere a method could be chosen, not only at the point of payment:
The last row is the one that matters for correctness. The catalogues are a convenience; the attempt check is the guarantee. A stale page or a hand-written request cannot get around it.
Rejected at creation
A restriction your project cannot honour is refused with422 and no payment is created:
allow and deny on the same axis is a validation error rather than a silent resolution:
Satisfiability is checked against your whole routing configuration, not against one country.
allow: ["card"] passes creation if cards are routed anywhere in your project — a payer landing in a country where they are not routed still sees nothing. Restrict by category rather than by code when the payer’s country is not known upfront.Reading it back
The restriction is echoed on the payment, and on the checkout when you used one. Only the keys you set are present:checkout.restriction carries the method lists next to the country and the obfuscated phone number.