public

POST /v1/public/pricing/tax-quote

What these net prices look like to a signed-out visitor, after VAT.

All public endpoints

All developer docs →

Authentication

This endpoint is public. It takes no credential and no organisation — it is what our own marketing site and AI answer engines read.

This endpoint takes no organisation id. Your key already identifies the organisation it belongs to, and the response is scoped to it.

Try it

Replace anything in angle brackets with your own values, and the key placeholder with a key from your dashboard.

curl -X POST https://api.zinndigital.com/v1/public/pricing/tax-quote \
  -H "Content-Type: application/json" \
  -d '{ "items": <object[]> }'

Signed in? The API console in your dashboard fills in your real organisation id and your own key, and runs the request against the live API so you can see the actual response. Open this endpoint in the API console

Details

The anonymous half of quoteTaxDisplay (#1482). Same answer, one difference that matters: there is no organisation, so there is no validated VAT number and every visitor is treated as a consumer. ⛔ This route accepts no buyer-validation flag, deliberately. Reverse charge turns on a VIES-validated number and the seller carries the liability for granting it wrongly (docs/34 §2.3), so a client-supplied validation claim would be a request to zero-rate a sale on the buyer's own say-so. Treating everyone as a consumer is also the safe direction: it over-states rather than under-states the tax due. Country comes from the request body or Cloudflare's CF-IPCountry. The answer is always estimated: true — a pricing page runs on a geo hint, and the charge is rated again at checkout against real place-of-supply evidence.

Request body

NameTypeRequiredWhat it is
countrystringNoISO 3166-1 alpha-2 destination. On the signed-in route this overrides the stored billing country (the customer may be pricing an address they have not saved). Omitted on the…
currencystringNoISO 4217. Defaults to the docs/29 §3.1 resolution for the request.
itemsobject[]Yes—

Response

NameTypeRequiredWhat it is
currencystringYes—
countrystringYesThe destination the figures were rated for, or "" if none was known.
display_modestring<gross, net>YesWhich figure leads. gross for a consumer (with the VAT shown separately), net for a validated business and for any supply carrying no VAT. ⛔ Read it; do not re-derive it — the…
noticestring<vat_included, reverse_charge, no_vat, vat_at_checkout>YesA key, never rendered prose — every user-facing string goes through the frontend i18n layer in all 58 locales (§2.7, §2.19), so a wording change is a translation change rather…
rate_bpsintegerYesThe single rate behind notice, or 0 where the basket carries more than one. A mixed basket (hosting at the buyer's rate, a website build at UK 20%) genuinely has no single…
estimatedbooleanYesThe figures ran on weak evidence (a geo hint, no billing address) and are indicative. The charge is rated again at checkout against full place-of-supply evidence, and that is…
indeterminatebooleanYesThe supply could not be rated and the net figure is being shown with notice: vat_at_checkout. Never true alongside a non-zero tax_total_minor.
net_total_minorintegerYes—
tax_total_minorintegerYes—
gross_total_minorintegerYes⛔ Equal to net in the indeterminate fallback, never 0 — a caller rendering this field unconditionally must show the price rather than a free product.
linesobject[]Yes—

Errors this endpoint can return

422 · 429