billing
POST /v1/pricing/tax-quote
What these net prices look like to this customer, after VAT.
認証
ベアラー トークンとして API キーを送信します。このエンドポイントでは仕様に特定の権限が記載されていないため、キーに必要な最小限の権限を付与し、推測するのではなくレスポンスを確認してください。
このエンドポイントは組織IDを受け付けません。お使いのキーによって所属する組織がすでに特定されており、レスポンスはその組織にスコープされます。
試してみる
アングルブラケット内のすべてをご自身の値に置き換え、キーのプレースホルダーをご利用中のダッシュボードのキーに置き換えてください。
curl -X POST https://api.zinndigital.com/v1/pricing/tax-quote \
-H "Authorization: Bearer zdk_live_…" \
-H "Content-Type: application/json" \
-d '{ "items": <object[]> }'ログインしていますか?ダッシュボード内のAPIコンソールでは、実際の組織IDやお客様ご自身のキーが自動入力され、ライブAPIに対してリクエストが実行されるため、実際のレスポンスを確認することができます。 API コンソールでこのエンドポイントを開く
詳細
⚖️ **Net-constant pricing** (owner ruling 2026-08-04, `docs/34` §2.1a ruling 3, #1482). The advertised figure is **net** and VAT is added on top at the destination rate, so our revenue per sale is identical everywhere: a €10 plan nets €10 whether the buyer is in Germany or Hungary, and their total differs (€11.90, €12.70) because their own rate does. **A consumer is shown the VAT-inclusive figure; a business with a VIES-validated VAT number is shown net.** `display_mode` says which — read it, never derive it. The discriminator is **validation state**, not "has typed a VAT number": an unvalidated number is charged VAT (§2.3), so treating it as a business would understate what the customer pays. ⛔ **This endpoint rates; it never prices.** The caller passes amounts it already holds from the catalogue, so this cannot become a second source of prices that drifts from the first. ⭐ **Both figures always come back**, whichever one leads, so a frontend picks a field rather than multiplying by a rate. A rate applied in TypeScript is a float applied to money (§2.8) *and* a second implementation of the tax rules — one rounding rule away from the invoice, for ever. ⛔ **`indeterminate: true` means the supply could not be rated** (usually a member state with no `TaxRate` row) and the net figure is being returned with `notice: vat_at_checkout`. It is not an error to surface: the charge path refuses in that situation, correctly, but a pricing page that refused would go **blank for a whole country**. In the fallback `gross_total_minor` equals net and is never `0`, so a caller rendering the gross field unconditionally shows the price rather than a free product.
リクエスト本文
| 名前 | タイプ | 必須 | これがその内容です |
|---|---|---|---|
country | string | いいえ | ISO 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 pub… |
currency | string | いいえ | ISO 4217. Defaults to the `docs/29` §3.1 resolution for the request. |
items | object[] | はい | — |
返信
| 名前 | タイプ | 必須 | これがその内容です |
|---|---|---|---|
currency | string | はい | — |
country | string | はい | The destination the figures were rated for, or `""` if none was known. |
display_mode | string<gross, net> | はい | Which 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 — t… |
notice | string<vat_included, reverse_charge, no_vat, vat_at_checkout> | はい | A **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 rath… |
rate_bps | integer | はい | The 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 r… |
estimated | boolean | はい | The 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** i… |
indeterminate | boolean | はい | The 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_minor | integer | はい | — |
tax_total_minor | integer | はい | — |
gross_total_minor | integer | はい | ⛔ Equal to net in the `indeterminate` fallback, **never 0** — a caller rendering this field unconditionally must show the price rather than a free product. |
lines | object[] | はい | — |
このエンドポイントが返すエラー
401 · 422