botchannels

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).

Sample request (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
yes or no.
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).

Sample response (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.

Sample request (draft)

{
  "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.

Sketch of a request (draft, shape not fixed)

{
  "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 decide call can read it as evidence.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).