API Changelog
Version 2026-03-01
Release Date: March 1, 2026This version adds IP-based tax resolution to calculations and platform calculations, plus a headless ECM read API for managing exemption certificates and certificate requests.
New: Headless ECM read API (certificate-requests + certificates)
The headless ECM surface lets a client embed exemption-certificate
collection in their own product — list, retrieve, and cancel certificate
requests, and list / retrieve certificates with per-jurisdiction validity
and a short-lived download URL.These endpoints are live-only (
sk_test_* keys return
TESTMODE_NOT_SUPPORTED) and are scoped by your API key’s account.New Endpoints
Certificate Requests
Manage outstanding certificate collection requests.
GET /tax/certificate-requests— ListGET /tax/certificate-requests/{request_id}— GetDELETE /tax/certificate-requests/{request_id}— Cancel (terminal, idempotent)
Certificates
Read submitted certificates and download the original document.
GET /tax/certificates— List with filters (customer, jurisdiction, status, type, dates)GET /tax/certificates/{certificate_id}— Get with short-liveddownload_url
Public status vocabulary
Thestatus field on both objects uses a deliberately narrow public
vocabulary — Numeral’s review pipeline runs many internal states that are
not surfaced.
| Object | Statuses |
|---|---|
tax.certificate_request | pending, fulfilled, canceled, invalid |
tax.exemption_certificate | processing, needs_info, active, expiring, expired, invalid |
expiring and expired are kept distinct from invalid so a renewable
lapse is distinguishable from a rejected or revoked certificate.
New error types
| Type | HTTP Code | Description |
|---|---|---|
CERTIFICATE_NOT_FOUND | 404 | Certificate not found |
CERTIFICATE_REQUEST_NOT_FOUND | 404 | Certificate request not found |
REQUEST_ALREADY_FULFILLED | 409 | Cannot cancel a fulfilled request |
REQUEST_INVALID | 409 | Cannot cancel a request in a terminal invalid state |
Error Codes Reference
See the full list of error types and their meanings.
Notes
- Cancel is terminal and idempotent — calling
DELETEon an already-canceled request returns200with the same body. download_urlonGET /tax/certificates/{id}is a pre-signed URL with roughly a 1-hour TTL. Re-fetch the certificate to mint a new URL. The URL isnull(response is still200) when no document is attached yet.- Webhooks for certificate state transitions (e.g.
certificate.processing_completed) will ship under the Public Webhooks Platform. Polling these read endpoints is the supported interim pattern.
New Feature: IP-Based Tax Resolution
IP Resolution
Pass a customer IP address instead of a full address for tax calculations.
- Works with both
/tax/calculationsand/tax/platform/calculations - Supports IPv4 and IPv6 addresses
Resolution Modes
Control how insufficient IP data is handled.
strict- Error if insufficient detailzero- Return zero-rateapproximate- Use most populous ZIPbest_effort- Try approximate, fall back to zero
The customer.ip Object
Instead of providing customer.address, you can now pass customer.ip:
| Field | Type | Required | Description |
|---|---|---|---|
value | string | Yes | A valid IPv4 or IPv6 address |
resolution | string | No | Resolution strategy (default: "strict") |
At least one of
customer.address or customer.ip must be provided. You can also provide both — the address will be used first, with IP as a fallback.Resolution Modes
| Mode | Behavior |
|---|---|
strict (default) | Returns an error if IP cannot resolve to sufficient detail for tax calculation |
zero | Returns a zero-rate response immediately if resolution is insufficient |
approximate | Attempts to resolve the IP to an address using heuristics |
best_effort | Tries approximate first, falls back to zero rates if that also fails |
New Response Fields
Calculation responses now include these additional fields:| Field | Type | Description |
|---|---|---|
location_source | string | "address" or "ip" — which input was used for tax determination |
resolution_precision | string | Precision level: STREET, POSTAL_PLUS, POSTAL, PROVINCE, COUNTRY, or APPROXIMATED |
address_used | object | The resolved address that was actually used for tax calculation |
Example: IP-Based Calculation
New Error Types
| Type | HTTP Code | Description |
|---|---|---|
INVALID_IP_FORMAT | 400 | ip.value is not a valid IPv4 or IPv6 address |
IP_RESOLUTION_FAILED | 422 | IP could not be resolved to any country |
IP_RESOLUTION_INSUFFICIENT_US | 422 | IP resolved to a US state but no postal code was found |
IP_RESOLUTION_INSUFFICIENT_CA | 422 | IP resolved to CA but no province was found |
Error Codes Reference
See the complete list of error types and their meanings.
New Field: transacted_at
Calculations and platform calculations now accept an optional top-level transacted_at field — the time the transaction occurred, as a Unix timestamp in seconds. It determines which tax rates and rules apply at that point in time (for example, during a sales tax holiday). If omitted, the calculation uses the current time.
| Field | Type | Required | Description |
|---|---|---|---|
transacted_at | integer | No | Unix timestamp in seconds of when the transaction occurred. Defaults to the current time when omitted. |
Migration Guide
From 2026-01-01 to 2026-03-01
There are no breaking changes from 2026-01-01. All existing requests continue to work as-is.
- Update your
X-API-Versionheader to2026-03-01 - Optionally use
customer.ipinstead of or in addition tocustomer.address - Handle new 422 error types if using IP resolution with
strictmode - Check
location_sourcein responses to see whether address or IP was used
Version 2026-01-01
Release Date: January 1, 2026This version introduces Merchant Management and Platform Calculations for marketplace and payment processor scenarios.
New Endpoints
Merchant CRUD
Full create, read, update, and delete operations for merchants (sellers) on your platform.
POST /tax/merchants- Create merchantGET /tax/merchants- List merchantsGET /tax/merchants/:id- Get merchantPOST /tax/merchants/:id- Update merchantDELETE /tax/merchants/:id- Delete merchant
Platform Calculations
Tax calculations for marketplace transactions with merchant context.
POST /tax/platform/calculations
Platform Transactions
Convert platform calculations into recorded transactions for tax reporting.
POST /tax/platform/transactions
Breaking Changes
New Features
Merchant Management
Create and manage merchants (sellers) on your platform:- Use your own IDs via
reference_merchant_id - Store merchant tax IDs for B2B transactions
- Default addresses used as origin in calculations
- Testmode isolation (test merchants separate from live)
Platform Calculations
Calculate taxes for marketplace/platform transactions:- Per-unit pricing -
amount × quantity = taxable base - Merchant context - Link calculations to specific sellers
- Platform roles - Specify your role (marketplace, payment processor, merchant of record)
- Fee calculations - Separate tax calculation for platform fees
- Enhanced response - Includes
tax_authority_name,tax_authority_type,tax_type
Platform Roles
Specify your role in the transaction:| Role | Description |
|---|---|
marketplace_provider | You operate a marketplace connecting buyers and sellers |
payment_processor | You process payments for the transaction |
merchant_of_record | You are the legal seller of record |
Platform Transactions
Convert platform calculations into recorded transactions for tax reporting and filing:- Returns a list - May return one or two transactions depending on your platform role
- Payment processors - Receive separate
orderandfeetransactions - Marketplace providers / Merchants of record - Receive a single
ordertransaction - Transaction types -
type: "order"for sales,type: "fee"for platform fees
| Platform Role | Transactions Created |
|---|---|
payment_processor | 2 (order + fee) |
marketplace_provider | 1 (order only) |
merchant_of_record | 1 (order only) |
Fee Calculations
Calculate taxes on platform fees separately from order items:Enhanced Tax Response
Platform calculations include additional jurisdiction details:| Field | Description |
|---|---|
tax_authority_name | Human-readable authority name |
tax_authority_type | STATE, COUNTY, CITY, or DISTRICT |
tax_type | SALES, USE, VAT, or GST |
New Error Format
Previous format (2025-05-12 and earlier):- Flattened structure - No more nested
errorobject - HTTP status in response -
codefield contains the HTTP status code - Uppercase error types - Error types are now SCREAMING_SNAKE_CASE
- Consistent typing - Use the
typefield for programmatic error handling
Error Codes Reference
See the complete list of error types and their meanings.
Previous Versions
| Version | Key Features |
|---|---|
| 2026-01-01 | Merchant management, platform calculations, per-unit pricing, fee calculations |
| 2025-05-12 | Customer types (B2B/B2C), tax IDs, 32 currencies, automatic_tax |
| 2024-09-01 | Base version with core tax calculation features |