botchannels

Can I sell to this customer? botchannels answers yes or no - per buyer jurisdiction, under the VAT thresholds that apply to you - and keeps the counters.

DE yes CH no UK no DE
DE yes CH no

Threshold routing API

decide answers yes or no for that buyer’s jurisdiction, under the thresholds that apply to you. report adds the sale to the counter. The free default policy blocks a sale that needs a registration you have not entered. Entering that registration opens the gate. Each answer cites its rule version.

How a decision is made

402 SMS record

Phone verification for bots

An x402-paid call sends a one-time code by SMS through our Twilio subscription. The seller pays, or the buyer pays once. A buyer whose IP is outside the country they declare gets a SIM-country evidence record a later decision can cite.

The verification flow

Three calls

  1. create_channel returns channel_id and the API key once.
  2. add_registration enters a registration on that channel.
  3. decide answers yes or no. report adds the sale to the counter.

Later calls send Authorization: Bearer bc_….

Placeholder values. Not a ruling.

Request

POST /decide HTTP/1.1

{
  "seller_id": "seller",
  "buyer_country": "DE",
  "buyer_region": null,
  "evidence": {
    "ip": "203.0.113.24",
    "ip_country": "DE",
    "ip_region": null,
    "phone_country": null
  },
  "amount": "1240.50",
  "currency": "EUR",
  "product_class": "digital_service",
  "pass_days": null
}

Response

yes

HTTP/1.1 200

{
  "decision": "yes",
  "reason": "open",
  "registration_that_opens_the_gate": null,
  "rule_version": "2026-10-22.v1",
  "jurisdiction": "DE",
  "rate_hint": null
}

Request

POST /decide HTTP/1.1

{
  "seller_id": "seller",
  "buyer_country": "CH",
  "buyer_region": null,
  "evidence": {
    "ip": "203.0.113.24",
    "ip_country": "CH",
    "ip_region": null,
    "phone_country": null
  },
  "amount": "1240.50",
  "currency": "EUR",
  "product_class": "digital_service",
  "pass_days": null
}

Response

no

HTTP/1.1 200

{
  "decision": "no",
  "reason": "missing_registration",
  "registration_that_opens_the_gate": "CHE-UID",
  "rule_version": "2026-10-22.v1",
  "jurisdiction": "CH",
  "rate_hint": null
}

Attestation

The decide response carries an Ed25519 attestation. The seller keeps the attestation. The server keeps only the outcome and the counters.

{
  "kid": "server-1",
  "alg": "Ed25519",
  "payload": {
    "v": 1,
    "channel_id": "channel",
    "decision": "yes",
    "reason": "open",
    "rule_version": "2026-10-22.v1",
    "jurisdiction": "DE",
    "buyer_country": "DE",
    "buyer_region": null,
    "ip_country": "DE",
    "declared_country": "DE",
    "ts": "2026-10-22T00:00:00Z",
    "nonce": "nonce"
  },
  "signature": "base64url"
}

MCP

decide is an MCP tool call over streamable HTTP. The channel key is sent as Authorization: Bearer bc_…. The host below is a placeholder.

POST /mcp HTTP/1.1
Host: mcp.example.invalid
Authorization: Bearer bc_…
Accept: application/json, text/event-stream
Content-Type: application/json

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "decide",
    "arguments": {
      "buyer_country": "DE",
      "buyer_region": null,
      "amount": "1240.50",
      "currency": "EUR",
      "product_class": "digital_service"
    }
  }
}

Tool names: create_channel, set_profile, add_registration, remove_registration, decide, report, status, projection, rules_version, export_data, delete_channel.

Placeholder values. Not a ruling. Draft field lists.

Stored, and not stored

Stored

A decision stores the channel, the yes or no, the reason, the rule version, the declared country and region, and the time. report stores the amount, the currency, the country, the region, the period, the sale id, and the timestamp.

Not stored

The buyer IP is looked up, then discarded. The IP hash, the evidence hash, and the phone number are not stored.

The free default policy is available now. Paid verification is priced later. No price is published.

A decision cites the rule version it used. That citation is a trace of which text was applied. Correctness stays with the reviewer. This is not legal or tax advice, and it is not a compliance guarantee.

Threshold kinds by jurisdictionRussia. nil-threshold. No amount. In scope from the first supply, so blocked until a registration is entered. Verify.Canada. sales-into threshold. CAD 30k federal. Provinces: QC CAD 30k; BC CAD 10k; SK and MB low or nil. Verify.United States. sales-into threshold. USD 100k and/or 200 transactions. Per state. taxes_saas often false. Verify.China. blocked. crypto_payment_prohibited. Default is refuse. No registration opens it. Verify.Brazil. blocked. Sub-national. Refuse by default. Verify.Australia. sales-into threshold. AUD 75k. Verify.India. nil-threshold. OIDAR. No amount. In scope from the first supply, so blocked until a registration is entered. Verify.Argentina. blocked. Sub-national. Refuse by default. Verify.Algeria. blocked. crypto_payment_prohibited. Default is refuse. No registration opens it. Verify.Mexico. nil-threshold. No amount. In scope from the first supply, so blocked until a registration is entered. Verify.Saudi Arabia. nil-threshold. No amount. In scope from the first supply, so blocked until a registration is entered. Verify.South Africa. nil-threshold. No amount. In scope from the first supply, so blocked until a registration is entered. Verify.Chile. nil-threshold. No amount. In scope from the first supply, so blocked until a registration is entered. Verify.Italy. sales-into threshold. EUR 10k. current_and_previous_year. Below: home-country VAT. Above: destination VAT and OSS. Verify.Colombia. nil-threshold. No amount. In scope from the first supply, so blocked until a registration is entered. Verify.Japan. sales-into threshold. JPY 10M. Verify.Romania. sales-into threshold. EUR 10k. current_and_previous_year. Below: home-country VAT. Above: destination VAT and OSS. Verify.Nepal. blocked. crypto_payment_prohibited. Default is refuse. No registration opens it. Verify.Egypt. blocked. crypto_payment_prohibited. Default is refuse. No registration opens it. Verify.Finland. sales-into threshold. EUR 10k. current_and_previous_year. Below: home-country VAT. Above: destination VAT and OSS. Verify.Latvia. sales-into threshold. EUR 10k. current_and_previous_year. Below: home-country VAT. Above: destination VAT and OSS. Verify.Sweden. sales-into threshold. EUR 10k. current_and_previous_year. Below: home-country VAT. Above: destination VAT and OSS. Verify.Korea. nil-threshold. No amount. In scope from the first supply, so blocked until a registration is entered. Verify.Norway. sales-into threshold. About NOK 50k. Verify.Cambodia. blocked. crypto_payment_prohibited. Default is refuse. No registration opens it. Verify.Bangladesh. blocked. crypto_payment_prohibited. Default is refuse. No registration opens it. Verify.Austria. sales-into threshold. EUR 10k. current_and_previous_year. Below: home-country VAT. Above: destination VAT and OSS. Verify.Belgium. sales-into threshold. EUR 10k. current_and_previous_year. Below: home-country VAT. Above: destination VAT and OSS. Verify.Bulgaria. sales-into threshold. EUR 10k. current_and_previous_year. Below: home-country VAT. Above: destination VAT and OSS. Verify.Croatia. sales-into threshold. EUR 10k. current_and_previous_year. Below: home-country VAT. Above: destination VAT and OSS. Verify.Czechia. sales-into threshold. EUR 10k. current_and_previous_year. Below: home-country VAT. Above: destination VAT and OSS. Verify.Denmark. sales-into threshold. EUR 10k. current_and_previous_year. Below: home-country VAT. Above: destination VAT and OSS. Verify.France. sales-into threshold. EUR 10k. current_and_previous_year. Below: home-country VAT. Above: destination VAT and OSS. Verify.Greece. sales-into threshold. EUR 10k. current_and_previous_year. Below: home-country VAT. Above: destination VAT and OSS. Verify.Hungary. sales-into threshold. EUR 10k. current_and_previous_year. Below: home-country VAT. Above: destination VAT and OSS. Verify.Ireland. sales-into threshold. EUR 10k. current_and_previous_year. Below: home-country VAT. Above: destination VAT and OSS. Verify.Lithuania. sales-into threshold. EUR 10k. current_and_previous_year. Below: home-country VAT. Above: destination VAT and OSS. Verify.Netherlands. sales-into threshold. EUR 10k. current_and_previous_year. Below: home-country VAT. Above: destination VAT and OSS. Verify.Portugal. sales-into threshold. EUR 10k. current_and_previous_year. Below: home-country VAT. Above: destination VAT and OSS. Verify.Slovakia. sales-into threshold. EUR 10k. current_and_previous_year. Below: home-country VAT. Above: destination VAT and OSS. Verify.UK. nil-threshold. No amount. In scope from the first supply, so blocked until a registration is entered. Verify.Turkey. nil-threshold. No amount. In scope from the first supply, so blocked until a registration is entered. Verify.Switzerland. global-turnover test. CHF 100k worldwide. previous_year. Verify.Singapore. global-turnover test. SGD 1M worldwide and SGD 100k local. Verify both limbs.Cyprus. sales-into threshold. EUR 10k. current_and_previous_year. Below: home-country VAT. Above: destination VAT and OSS. Verify.Estonia. sales-into threshold. EUR 10k. current_and_previous_year. Below: home-country VAT. Above: destination VAT and OSS. Verify.Luxembourg. sales-into threshold. EUR 10k. current_and_previous_year. Below: home-country VAT. Above: destination VAT and OSS. Verify.Malta. sales-into threshold. EUR 10k. current_and_previous_year. Below: home-country VAT. Above: destination VAT and OSS. Verify.Slovenia. sales-into threshold. EUR 10k. current_and_previous_year. Below: home-country VAT. Above: destination VAT and OSS. Verify.Spain. sales-into threshold. EUR 10k. current_and_previous_year. Below: home-country VAT. Above: destination VAT and OSS. Verify.Morocco. blocked. crypto_payment_prohibited. Default is refuse. No registration opens it. Verify.Germany. sales-into threshold. EUR 10k. current_and_previous_year. Below: home-country VAT. Above: destination VAT and OSS. Verify.New Zealand. sales-into threshold. NZD 60k. Verify.Poland. sales-into threshold. EUR 10k. current_and_previous_year. Below: home-country VAT. Above: destination VAT and OSS. Verify.
Rules are versioned data, not advice.

Demo

Our own RPC endpoints are the first integration.