Draft API
Draft. Every call on this page is a draft. Field names follow the plan. The service is not offered at a public URL yet. Samples are placeholders, not a ruling.
Three calls. None of them moves money. A decision cites a rule version. That is a trace, not legal or tax advice, and not a compliance guarantee. The free default policy is available now. Paid verification is priced later. No price is published.
POST /decide (draft)
Ask whether this seller may sell to this buyer. The answer is yes or no.
Request
- seller_id
- The seller who is asking.
- buyer_country
- Declared country of the buyer.
- buyer_region
- Optional. Declared state or province. Required for the United States and Canada.
- evidence.ip
- Buyer IP, kept as evidence.
- evidence.ip_country
- Country derived from that IP.
- evidence.ip_region
- Optional. Region derived from that IP.
- evidence.phone_country
- Optional. SIM country from phone verification. The plan stores a hash of the number, not the number. When this item is required is not settled (draft).
- amount
- Amount of the proposed sale.
- currency
- Currency of that amount.
- product_class
- What is being sold.
- pass_days
- Days, when the proposed sale is a pass. The plan names the field and does not fix when it is required (draft).
{
"seller_id": "seller",
"buyer_country": "CC",
"buyer_region": null,
"evidence": {
"ip": "203.0.113.24",
"ip_country": "CC",
"ip_region": null,
"phone_country": null
},
"amount": "1240.50",
"currency": "EUR",
"product_class": "digital_service",
"pass_days": null
}
Response
- decision
yesorno.- reason
- Why that answer was given.
- registration_that_opens_the_gate
- Optional. Present when a no is a missing registration, and names that registration. A registration does not open a sanctions no, or a no for
crypto_payment_prohibited. Those name themselves. - rule_version
- The dataset version this decision cited.
- jurisdiction
- The jurisdiction the rule was applied in.
- rate_hint
- Optional. The plan names the field and does not fix its shape (draft).
{
"decision": "yes",
"reason": "open",
"registration_that_opens_the_gate": null,
"rule_version": "draft",
"jurisdiction": "CC",
"rate_hint": null
}
Both the declared country and the IP country are evaluated. Both yes, under the same tax treatment, and the sale can proceed; the decision records both. If they diverge, the answer is no. There is no IP block list. Phone verification can add a SIM country for a later call to read. Invoice issuance is rate-limited per IP and per ASN before a decide call is spent.
POST /report (draft)
Tell the API a sale happened, so the counter for that seller, jurisdiction, and period stays current. decide_id ties the report to the admit decision. Counters contain only what sellers report.
Request
- seller_id
- The seller reporting the sale.
- sale_id
- The seller's id for this sale.
- payment_hash
- Hash of the payment. The secret of a payment is not sent.
- amount
- Amount reported.
- currency
- Currency of that amount.
- buyer_country
- Buyer country on the sale.
- buyer_region
- Optional. Buyer state or province.
- ts
- When the sale happened.
- evidence_hash
- Hash of the evidence. Raw evidence is not sent again.
- decide_id
- The admit decision this receipt belongs to.
{
"seller_id": "seller",
"sale_id": "sale",
"payment_hash": "hash",
"amount": "1240.50",
"currency": "EUR",
"buyer_country": "CC",
"buyer_region": null,
"ts": "2026-10-22T00:00:00Z",
"evidence_hash": "hash",
"decide_id": "decide"
}
Response
The counters that report updated, per seller, jurisdiction, and period. The plan does not fix the JSON (draft).
POST /verify-phone (draft)
An x402-paid SMS. Unpaid, the response is HTTP 402. After the one-time payment, Twilio sends a one-time code. Submitting the code returns an evidence record. The seller pays, or the buyer pays once. The plan stores a hash of the number, not the number. The plan names this call and these steps. It does not fix the JSON (draft). No price is published.
Request
- seller_id
- The seller the verification is for. Draft. The plan does not fix the field name.
- buyer_country
- Declared country the verification is about.
- payer
- Who pays the one-time call: the seller, or the buyer. Draft. The plan does not fix the token.
- phone
- Mobile number the SMS is sent to. Only a hash is kept.
- code
- The one-time code from the SMS, submitted after the message is sent. Draft. The plan does not fix this second request.
{
"seller_id": "seller",
"buyer_country": "CC",
"payer": "seller",
"phone": "+10000000000"
}
Response
- 402
- Unpaid. The body is the x402 challenge. The plan does not fix that JSON (draft).
- phone_country
- SIM country on the evidence record. A later
decidecall can read it asevidence.phone_country. - step-up hash
- Hash of the mobile number. The number is not stored. The plan does not fix the field name (draft).
What decide reads on the seller (draft)
Home country, global turnover for the previous calendar year, and registrations already held. A separate profile endpoint is not in the plan (draft).