vatverify home
All errors

b2c_not_supported

The /decide endpoint only handles B2B transactions. B2C is not supported in v1.

HTTP 400 · Bad Request

Example response

{
  "error": {
    "code": "b2c_not_supported",
    "message": "B2C transactions are not supported. /decide handles B2B only."
  },
  "meta": {
    "request_id": "a1b2c3d4-...",
    "latency_ms": 0
  }
}

What happened

POST /v1/decide is designed for B2B transactions, where both parties are VAT-registered businesses. B2C (business-to-consumer) involves different rules in each country that are out of scope for v1.

How to fix

For B2C transactions, apply your seller country's standard VAT rate to the sale. You can retrieve this from GET /v1/rates/:country:

curl https://api.vatverify.dev/v1/rates/de
# Returns standard_rate: 19 for Germany

The buyer's location determines the rate for digital services (OSS rules), but for most physical goods, the seller's country rate applies.

Why /decide is B2B-only

/v1/decide answers "should I charge VAT, and which country's?" by combining the EU VAT Directive's reverse-charge logic with the buyer-side validity check. The reverse-charge mechanism is fundamentally a B2B concept under Articles 138 and 196 of the Directive: it triggers on a valid VAT-registered counterparty.

B2C falls outside that mechanism and into a different decision tree:

  • Distance sales of goods route through OSS once the EU-wide €10,000 threshold is crossed.
  • Digital services to EU consumers use the destination-country rate under place-of-supply rules and report through OSS.
  • Local B2C sales apply the seller's domestic rate.

Each of those branches has different evidence requirements (location proofs, threshold tracking, OSS registration status) that v1 does not model. Folding them into /decide would change the contract substantially.

How to detect B2C client-side

If you call /v1/decide without a buyer VAT number, the API treats the transaction as B2C and returns this error. The check on your side is simple: if buyer_vat is empty, do not call /decide. Use /v1/rates/:country instead and apply the seller-country logic.

See the reverse charge glossary for the rule that drives the B2B-only design, and the OSS glossary for the B2C path.

Common mistakes

  • Calling /decide when the buyer has no VAT number: if there is no buyer_vat, the transaction is B2C. Use the rates endpoint instead.
  • Expecting /decide to handle all transaction types: it is intentionally scoped to EU B2B only in v1.