A calculation quotes the tax for a cart. Create one at checkout after the customer enters an address and before you take payment. Use its The response has the totals and a breakdown for each line item. Most integrations charge
id to record a transaction once the customer pays.Where calculations fit in checkout
total_tax_amount and keep the details for when they need them.The Calculation object
Attributes
One entry per line item in the request.
One row per taxing jurisdiction.
Statutory rate for the jurisdiction, as a decimal fraction (
0.07 = 7%), rounded to 6 decimal places. Some rates apply to only part of the amount, so don’t sum these. See Effective tax rate.Unrounded tax due for this jurisdiction, in the currency’s smallest unit. Can be fractional.
0 for flat-fee jurisdictions; see fee_amount.How precisely the customer address matched:
EXACT: exact street-level match.POSTAL_FALLBACK_1: fell back to a postal code match.POSTAL_ONLY: only the postal code was used.
The Calculation object
Effective tax rate
This version has no effective tax rate field. Don’t add up thetax_rate values to get one. Each is the statutory rate for its jurisdiction, and in some jurisdictions a rate applies to only part of the line amount.- Always charge the returned
tax_amountortotal_tax_amount. - For a line’s effective rate, divide its
tax_amountby itsamount_excluding_tax. For the whole order, dividetotal_tax_amountbytotal_amount_excluding_tax. tax_due_decimalshows how much each jurisdiction actually contributed.
tax_rate values sum to 12.25%, but tax_amount is $788.00: an effective rate of 78800 / 1000000 = 7.88%.Tennessee single article
Create a calculation
Quotes tax for a cart. SendX-API-Version: 2026-03-01 on every request. Accounts with no default version configured fall back to 2024-09-01, not this version. Try it in the API reference.Parameters
Who is buying. At least one of
customer.address or customer.ip is required.Destination address. Optional when
ip is sent; with both, the address is used first and the IP is the fallback for address problems.ISO 3166-2 subdivision code. Required for US and Canadian addresses, along with
address_postal_code. Always send it: if it’s missing on a US address, Numeral tries to infer the state from a valid 5-digit ZIP, and an unrecognized ZIP returns MALFORMED_ADDRESS.New in 2026-03-01. IP address for location lookup when you don’t have a full address. See IP-based tax resolution.
ID of a customer you created in Numeral. Used to track the customer or apply their tax exemption.
CONSUMER (individuals not registered for VAT/GST) or BUSINESS (entities registered for VAT/GST).Required when
type is BUSINESS and the address is outside the US (not enforced for IP-only requests). Not allowed for CONSUMER. Each has type, a Stripe-style tax ID type (e.g. us_ein, eu_vat, gb_vat, au_abn, ca_bn, jp_cn), and value. See tax IDs.The cart.
ISO 4217 currency code. See supported currencies.
auto returns real rates where you have an active registration. disabled always returns 0. Must be auto for US addresses.One entry per product. Each needs
reference_product_id or product_category.Per-unit price in the currency’s smallest unit (
2000 = $20.00). Taxable base is amount × quantity.Tax category from the category list. Required if no
reference_product_id.Your product ID, as created in Numeral. See Products. Required if no
product_category.Used when
reference_product_id isn’t found in Numeral, instead of returning an error. Lets you always send a product ID without creating the product first. Must be a valid category. If the product is found, its stored category wins.Ship-from address, used for origin-based sourcing. Required unless a default origin is set for the destination on your account. Same fields as
customer.address, without address_type.New in 2026-03-01. When the sale happened, Unix seconds (not milliseconds). Rates, rules such as sales tax holidays, and other time-dependent inputs such as out-of-state-seller status are evaluated as of this time. Defaults to now.
New in 2026-03-01.
CONSUMER or BUSINESS. Used when customer.id isn’t found in Numeral, instead of returning a 400. It drives exemption logic and business tax ID validation as if it were customer.type. If the customer is found, its stored type wins. BUSINESS on a non-US address still needs customer.tax_ids.CONSUMER. Treat the customer as a consumer when business tax ID validation fails, instead of returning a 400.String key-value pairs, echoed back in the response. Up to 50 keys; keys and values up to 255 characters. Non-string values are rejected.
Returns
A Calculation object.Response
IP-based tax resolution
New in 2026-03-01. Sendcustomer.ip instead of (or with) customer.address when you don’t have a full address. Numeral resolves the IP to a taxable location. With both, the address is used first and the IP is the fallback.The response shows how the location was found:
location_source is ip, resolution_precision shows how far the IP resolved, and address_used is the resolved address.IP resolution errors happen only in strict mode. To get a zero-rate response instead of an error, use best_effort or zero.Changes from earlier versions
If you’re upgrading, these are the request and response changes that carry into 2026-03-01.New in 2026-03-01customer.ipfor IP-based tax resolution, withlocation_sourceandresolution_precisionin the response.transacted_atanddefault_customer_type.
amountis the per-unit price. Taxable base isamount × quantity.
tax_jurisdictionsrows havetax_due_decimal,tax_authority_name,tax_authority_type,tax_type, and descriptiverate_typevalues.jurisdiction_nameandnoteare no longer returned.origin_addresssets the ship-from location for origin-based jurisdictions.address_resolution_statusandaddress_usedshow how the address was resolved.- Tax ID types expanded from
VATandGSTto 439+ Stripe-style types, such asus_ein,eu_vat,gb_vat,au_abn,ca_bn,jp_cn,in_gst, andbr_cnpj. - Errors use a flat format, replacing the nested
{ "error": { "code", "message" } }format.
origin_addressis required unless a default origin is set for the destination on your account.order_details.automatic_taxis required, and must beautofor US addresses.
Error format (2026-01-01 and later)