Skip to main content
The calculation object contains tax rate information with support for per-unit line item pricing, origin addresses, metadata passthrough, and enhanced tax jurisdiction detail. A calculation also includes a calculation_id that you’ll use to record a transaction for filing.

When to create Calculations

Calculations should be used any time you need to calculate sales tax before charging a customer for a transaction. Most e-commerce clients will submit a POST to /tax/calculations during their checkout flow after the end customer has submitted their address, but before collecting payment. core flow

How to create Calculations

We return both the aggregate tax information as well as a detailed breakdown for each line item. Many users will just use the total_tax_amount to identify what to charge a user, but you will always have the details as you need them.
Breaking Change: In version 2026-01-01, the amount field on line items represents the per-unit price. The taxable base is calculated as amount x quantity. This is a change from earlier versions where amount represented the total line item value.

Request Parameters

Customer Object

  • address (object): Required. The customer’s address for tax calculation.
  • type (string): Customer type affecting tax calculation.
    • CONSUMER (default) - Individual consumer, standard B2C tax calculations
    • BUSINESS - Business entity requiring tax IDs for B2B tax logic
  • tax_ids (array): Required for BUSINESS customers (except US), not allowed for CONSUMER customers.
    • type (string): Stripe-style tax ID type. 439+ types supported including us_ein, eu_vat, gb_vat, au_abn, ca_bn, jp_cn, and many more.
    • value (string): Valid tax identification number

Origin Address

The ship-from address used for origin-based tax jurisdictions. Required for accurate tax calculation in states that use origin-based sourcing rules.

Order Details

  • amount (number): Per-unit price in the currency’s smallest unit (e.g., cents for USD). The taxable base is amount x quantity.
  • automatic_tax (string): Controls tax collection and registration behavior.
    • auto - Return tax rates everywhere you have an active registration
    • disabled - Always return 0 tax regardless of thresholds
  • fallback_product_category (string): Optional. If you pass a reference_product_id that does not exist in Numeral, the calculation falls back to this product category instead of returning a 400. Useful for integration partners who want to always send a product ID without first ensuring the product has been created in Numeral. Must be a valid product category from the Numeral taxonomy. If the reference_product_id is found, its stored category takes precedence.

Metadata

Optional. Store arbitrary key-value pairs for your own reference. Values must be strings of 255 characters or fewer. Metadata is echoed back in the response unchanged.

New Features in 2026-01-01

Per-Unit Line Item Pricing

The amount field on line items now represents the per-unit price rather than the total line item value. The taxable base is calculated as amount x quantity.

Enhanced Tax Jurisdiction Detail

Tax jurisdiction objects in the response now include richer detail from the tax engine: The jurisdiction_name and note fields from prior versions are no longer included in 2026-01-01 responses.

Origin Address Support

You can now provide an origin_address representing the ship-from location. This is used for origin-based tax jurisdictions where the seller’s location affects the applicable tax rate.

Address Resolution

Responses now include information about how the address was resolved:
  • address_resolution_status (string): Indicates the precision of the address match.
  • address_used (object): The resolved address that was actually used for the tax calculation.

Expanded Tax ID Types

Tax ID types have been expanded from 2 types (VAT, GST) to 439+ Stripe-style types. Examples include us_ein, eu_vat, gb_vat, au_abn, ca_bn, jp_cn, in_gst, br_cnpj, and many more.

Standard Error Format

Error responses now use a flat format:
This replaces the previous nested format ({ "error": { "code": "...", "message": "..." } }).

Further documentation

The full documentation for creating calculations is on this page.