Decisions and outcomes
Every check — an entity condition or a project restriction — resolves to one of three outcomes:
| Decision | Meaning |
|---|---|
| Allow | The check passes. |
| Soft deny | The check couldn't be completed — usually because information it needed wasn't available. Checkout may prompt for that information or retry; it isn't a final "no." |
| Hard deny | The check fails outright. |
How outcomes combine on one item
An item can have several checks running against it at once — more than one entity condition, plus project restrictions when the purchase is against a project. The item is only allowed through if every one of its checks allows it; a single denial from any check denies the item. When more than one check fails, all of the failures are reported together, not just the first one, so everything that needs addressing is visible at once.
Reason codes
Each denial carries a machine-readable reason code identifying exactly what failed:
| Check | Reason code | Meaning |
|---|---|---|
| Any entity condition | condition.unknown | The item references a condition checkout doesn't recognize — the id doesn't exist, is disabled, or hasn't reached checkout yet (soft deny); see Entity condition |
| Age restriction | age_restriction.missing_context | Shopper's age wasn't available (soft deny) |
| Age restriction | age_restriction.underage | Shopper is below the minimum age |
| License requirement | license_requirement.missing_context | Shopper's licenses weren't available (soft deny) |
| License requirement | license_requirement.license_missing | Shopper's licenses don't include the required one |
| License requirement | license_requirement.level_insufficient | Shopper holds the license, but not at the minimum level (lower, missing, or not a whole number) |
| Project restriction | project_restriction.project_unreachable | The project's restrictions couldn't be looked up (soft deny) |
| Project restriction | project_restriction.property_missing | The item was missing a property a restriction needed, and wasn't allowed to be |
| Project restriction | project_restriction.whitelist_not_met | Item property's value wasn't in the allowed list |
| Project restriction | project_restriction.blacklist_not_met | Item property's value was in the denied list |
| Project restriction | project_restriction.item_not_whitelisted | Item id wasn't in the allowed list |
| Project restriction | project_restriction.blacklisted_item | Item id was in the denied list |
See the API reference for the exact response shape these appear in.
Things worth knowing
- An unrecognized condition doesn't hide the others. The item's other checks still run and report their own outcomes — an unknown id next to a failed age check reports both the soft deny and the hard deny.
- A
condition.unknownresult carries norule, since checkout can't tell which check the condition would have been. - Unknown project restriction types work the other way round. An unrecognized
restriction
typeon a project passes, while an unrecognized entity condition holds the item back — see Project restrictions.