Exemption Certificate Management
Exemption Certificate Management (ECM) gives sellers a structured way to collect, store, and apply US sales tax exemption certificates — and to demonstrate compliance when audited. Under US sales tax law, a seller who fails to collect tax must prove it holds a valid, unexpired exemption certificate for that buyer and jurisdiction. Without documented certificates, the seller bears the tax liability.
Key capabilities
- Structured certificate storage — capture certificate number, jurisdiction, form type, buyer details, and validity dates in a single record per certificate
- Calculation integration — reference a stored certificate at calculation time using
customer.exemptionRefto zero-rate the transaction automatically - Buyer collection wizard — generate a hosted link that guides a buyer through completing and submitting their exemption form; no custom UI required
- Automated expiry alerts — renewal reminders sent at 60, 30, 14, and 7 days before a certificate expires
- SST multi-state certificates — a single Streamlined Sales Tax certificate can cover all 24 SST member states
https://api.clearvo.io) and the same csk_live_* / csk_test_* key system. The certificate endpoints live under /v1/tax/exemptions.Create a Certificate
Creates a new exemption certificate record. The record stores the certificate metadata — jurisdiction, form type, validity dates, and your own reference — alongside the buyer's details. It does not store the underlying document file; attach the scanned certificate to your document management system and reference it via certificateRef.
certificateRef is your own identifier for the certificate document — for example, a file name, DMS document ID, or internal reference number. It is not the customer's sales tax permit number or tax ID. Use customerTaxId for the customer's tax registration number.Endpoint
POST https://api.clearvo.io/v1/tax/exemptions
curl https://api.clearvo.io/v1/tax/exemptions \
-X POST \
-H "x-api-key: csk_live_..." \
-H "Content-Type: application/json" \
-d '{
"certificateRef": "CERT-TX-ACME-2026-001",
"customerRef": "cus_abc123",
"customerName": "Acme Manufacturing LLC",
"customerTaxId": "12-3456789",
"certificateType": "MANUFACTURING",
"country": "US",
"region": "TX",
"effectiveFrom": "2026-01-01",
"effectiveTo": "2026-12-31"
}'
{
"certificate": {
"id": "cl_ec_01j9...",
"ids": ["cl_ec_01j9..."],
"certificateRef": "CERT-TX-ACME-2026-001",
"customerRef": "cus_abc123",
"customerName": "Acme Manufacturing LLC",
"customerTaxId": "12-3456789",
"certificateType": "MANUFACTURING",
"country": "US",
"regions": ["TX"],
"regionNames": ["Texas"],
"effectiveFrom": "2026-01-01",
"effectiveTo": "2026-12-31",
"status": "ACTIVE",
"createdAt": "2026-06-26T10:00:00.000Z"
}
}
Request fields
| Field | Type | Required | Description |
|---|---|---|---|
| certificateRef | string | Yes | Your identifier for the certificate document — a DMS reference, file name, or internal tracking number. This groups multi-state rows into a single certificate record. It is not the customer's tax ID. |
| customerRef | string | Yes | Your ERP or billing system reference for the customer (e.g. Stripe customer ID, SAP customer number). Passed by your system when generating a collection request so the submitted certificate is linked back to your customer record. |
| customerName | string | No | Legal name of the customer holding the exemption. |
| customerTaxId | string | No | The customer's EIN or tax registration number. Stored for audit identification only. |
| certificateType | string | Yes | The exemption basis. Valid values depend on country — for US: RESALE, MANUFACTURING, AGRICULTURAL, ENERGY, EXEMPT_ORG, GOVERNMENT, DIRECT_PAY, BLANKET_OTHER; for IE: EXPORT_AUTHORIZATION. See International Certificates. An unsupported country/type combination is rejected with 400, not silently accepted. |
| formType | string | Depends | Optional for US certificates: SST (Streamlined Sales Tax — covers all 24 member states, omit region), MTC (Multistate Tax Commission), or CUSTOM for a state-specific form. See SST Multi-State Certificates. Required and must be 56B for country: "IE". |
| country | string | No | ISO 3166-1 alpha-2 country code. Defaults to "US". Only US and IE are currently supported — any other value is rejected with 400. |
| region | string | No | Two-letter US state code (e.g. "TX", "CA"). Omit for SST multi-state certificates and for IE certificates — Section 56 authorisations are national, not sub-regional. |
| effectiveFrom | string | Yes | ISO 8601 date (YYYY-MM-DD) from which the certificate is valid. |
| effectiveTo | string | No | ISO 8601 date (YYYY-MM-DD) on which the certificate expires. Omit for open-ended certificates. When set, Clearvo sends renewal alerts and transitions status to EXPIRED on the expiry date. |
Certificate status values
| Status | Meaning |
|---|---|
ACTIVE | The certificate is within its validity period and can be applied to calculations. |
EXPIRED | The certificate's effectiveTo date has passed. Transactions against this certificate will not be zero-rated. Renew by creating a new certificate record and updating customer.exemptionRef on future calculations. |
REVOKED | The certificate has been manually revoked via PATCH /v1/tax/exemptions/{id} with { "status": "REVOKED" }. Distinct from deleting the record — a revoked certificate is retained and still listed, just no longer applied to calculations. |
Other certificate endpoints
| Method | Path | Description |
|---|---|---|
| GET | /v1/tax/exemptions | List certificates grouped by certificateRef — a multi-state certificate appears as one entry with regions[] and regionNames[]. Filter by status, country, or region. Supports page and limit (default 25, max 100). |
| GET | /v1/tax/exemptions/{id} | Retrieve a single certificate by its Clearvo ID. |
| PATCH | /v1/tax/exemptions/{id} | Update status (accepts "REVOKED" only — ACTIVE/EXPIRED transitions are system-managed), effectiveTo, or documentUrl. At least one field is required. |
| DELETE | /v1/tax/exemptions/{id} | Soft-delete a certificate. The record is retained for audit purposes but no longer appears in GET list results or matches new calculations. To keep the record visible but stop it from applying, use PATCH with status: "REVOKED" instead. |
Apply a Certificate at Calculation
To apply a stored exemption certificate to a transaction, pass customer.exemptionRef in the POST /v1/tax/calculate request body. Clearvo looks up the certificate, verifies it is ACTIVE and covers the transaction's jurisdiction, and applies a zero rate with tax code E (exempt) to qualifying line items.
This approach keeps the exemption decision in the API layer — your billing or ERP system passes the certificate ID it already holds for the buyer, and Clearvo resolves whether the exemption is valid for the current transaction.
curl https://api.clearvo.io/v1/tax/calculate \
-X POST \
-H "x-api-key: csk_live_..." \
-H "Content-Type: application/json" \
-d '{
"currency": "USD",
"commit": true,
"seller": {
"country": "US",
"address": { "country": "US", "region": "TX" }
},
"customer": {
"exemptionRef": "ecm_01j9...",
"address": { "country": "US", "region": "TX" }
},
"lineItems": [
{
"id": "line-1",
"amount": 4500.00,
"productName": "Industrial conveyor components"
}
]
}'
{
"calculationId": "cl_calc_02k7...",
"committed": true,
"exemption": {
"id": "ecm_01j9...",
"applied": true,
"status": "ACTIVE",
"certificateRef": "CERT-TX-ACME-2026-001"
},
"lineItems": [
{
"id": "line-1",
"taxCode": "E",
"rate": 0,
"taxableAmount": 4500.00,
"taxAmount": 0,
"totalAmount": 4500.00
}
],
"totals": {
"subtotal": 4500.00,
"totalTax": 0,
"total": 4500.00
}
}
The response includes an exemption object confirming which certificate was applied and its current status at the time of the calculation. If the certificate is EXPIRED or REVOKED at calculation time, the field exemption.applied is false, the standard tax rate is applied, and the response includes an exemption.reason string explaining why the certificate was not used.
exemption.certificateRef in the audit trail. This is the link your tax advisor needs to match an exempt sale on a return to the physical certificate on file — store the certificateRef alongside your invoice records.Buyer Collection Wizard
The buyer wizard provides a hosted, guided flow where the customer completes and submits their exemption certificate. You generate a time-limited collection link via the API and send it to the customer — by email, embedded in your portal, or included on an invoice. When the customer completes the form, the certificate record is created in your account automatically and a webhook event is fired.
This eliminates the need to build a custom exemption collection UI and reduces certificate rejection rates caused by incorrectly completed forms — the wizard enforces the required fields for the selected form type and jurisdiction.
Generate a collection link
/v1 endpoint for this today — the sections below describe the customer-facing flow and the inputs the dashboard asks for.You do not need to create a certificate record first. The link is keyed on the customer's email and your own customer reference; when the customer submits, a new certificate record is created and grouped under that reference automatically.
Collection link inputs
| Field | Type | Required | Description |
|---|---|---|---|
| customerEmail | string | Yes | The customer's email address. The collection link is sent here, and it identifies the customer on the submitted certificate. |
| customerRef | string | Yes | Your own identifier for the customer. Must match the customerRef you send on tax calculations so the resulting certificate is applied to the right customer. |
| expiresInDays | integer | No | Days until the link expires. Default: 30. Range: 1–90. After expiry, the link returns a 410 Gone page and you must generate a new one. |
| ccEmail | string | No | An optional address to copy on the collection email (e.g. your own accounts inbox). |
The customer opens the hosted wizard at app.clearvo.io/collect/{token}, fills in their details for the selected form type and jurisdiction, signs, and submits. On submission:
- A new certificate record is created (grouped under your
customerRef) with statusACTIVE - A
certificate.collectedwebhook event is sent to your configured endpoint
Expiry Tracking and Renewal Alerts
For any certificate with a validTo date set, Clearvo sends automated renewal alerts before expiry. Alerts are delivered as webhook events and as email notifications to the account's configured email address.
Alert schedule
| Days before expiry | Webhook event type | Action recommended |
|---|---|---|
| 60 | certificate.expiry_warning | Contact the customer to initiate renewal. Send a new collection link if the customer completes their own form. |
| 30 | certificate.expiry_warning | Follow up if renewal has not been received. Escalate in your accounts receivable workflow. |
| 14 | certificate.expiry_warning | Consider pausing exemption treatment for new orders until renewal is confirmed. |
| 7 | certificate.expiry_warning | Final alert. If no renewed certificate is received, the calculation engine will apply standard sales tax from the expiry date. |
| 0 (on expiry) | certificate.expired | The certificate status transitions to EXPIRED. New calculations referencing this certificate will not receive the exemption. |
Webhook payload
All certificate lifecycle events share the same payload shape:
{
"event": "certificate.expiry_warning",
"data": {
"id": "ecm_01j9...",
"customerName": "Acme Manufacturing LLC",
"customerTaxId": "12-3456789",
"region": "TX",
"certificateRef": "CERT-TX-ACME-2026-001",
"validTo": "2026-12-31",
"daysUntilExpiry": 30
},
"createdAt": "2026-12-01T00:00:00.000Z"
}
To receive webhook events, configure your endpoint in the Clearvo dashboard under Settings > Webhooks, or via the Webhooks API. Subscribe to the certificate.* event category to receive all certificate lifecycle events.
SST Multi-State Certificates
The Streamlined Sales Tax (SST) programme allows a buyer to submit a single exemption certificate that is valid in all 24 SST member states. Instead of collecting a separate certificate per state, you collect one SST certificate and it covers all member state jurisdictions automatically.
To create an SST certificate, set formType: "SST" and omit the region field. Clearvo stores the certificate as a multi-state record and matches it against transactions in any of the 24 member states when customer.exemptionRef is passed at calculation time.
SST member states
The 24 SST member states as of 2026:
AR, GA, IN, IA, KS, KY, MI, MN, NE, NV, NJ, NC, ND, OH, OK, RI, SD, TN, UT, VT, WA, WV, WI, WY
formType: "SST" is always matched against the current member state list, not against a snapshot taken at the time the certificate was created.curl https://api.clearvo.io/v1/tax/exemptions \
-X POST \
-H "x-api-key: csk_live_..." \
-H "Content-Type: application/json" \
-d '{
"customerName": "Horizon Wholesale Corp",
"customerTaxId": "55-1234567",
"country": "US",
"formType": "SST",
"reason": "Resale — SST multi-state certificate",
"certificateRef": "CERT-SST-HORIZON-2026",
"validFrom": "2026-01-01",
"validTo": "2026-12-31"
}'
{
"id": "ecm_02k8...",
"customerName": "Horizon Wholesale Corp",
"customerTaxId": "55-1234567",
"country": "US",
"region": null,
"formType": "SST",
"sstMemberStates": ["AR","GA","IN","IA","KS","KY","MI","MN","NE","NV","NJ","NC","ND","OH","OK","RI","SD","TN","UT","VT","WA","WV","WI","WY"],
"reason": "Resale — SST multi-state certificate",
"certificateRef": "CERT-SST-HORIZON-2026",
"validFrom": "2026-01-01",
"validTo": "2026-12-31",
"status": "ACTIVE",
"createdAt": "2026-06-26T10:00:00.000Z"
}
The response includes a sstMemberStates array listing the states covered at the time of creation. When a calculation references this certificate via customer.exemptionRef and the transaction's region matches any member state, the exemption is applied. Non-member states are unaffected — a transaction in CA (California, not an SST member) would not receive the exemption.
Non-SST states
For buyers who also need coverage in non-member states (such as California, New York, or Texas), collect a separate state-specific certificate for each and create individual certificate records with the region field set accordingly. Both the SST certificate and the state-specific certificates can be active for the same buyer simultaneously — Clearvo applies whichever certificate covers the transaction's jurisdiction.
International Certificates: Ireland Section 56 (56B)
Exemption Certificate Management supports a narrow, explicitly allowlisted set of non-US exemption schemes. Today that list is Ireland's Section 56 authorisation only — every country/certificateType/formType combination is validated against this allowlist on create, and an unsupported combination (including any other country) is rejected with 400 rather than silently accepted. This is deliberate: a certificate that zero-rates transactions against a jurisdiction with no such legal concept would be a serious compliance error, not a convenience.
Ireland's Section 56 authorisation ("56B") is issued by Irish Revenue to a "habitual exporter" — a business whose turnover is predominantly intra-EU dispatches, exports outside the EU, or qualifying contract work performed outside Ireland. The holder gives a copy of the authorisation to their Irish suppliers, who zero-rate qualifying sales to them for the authorisation's validity period (typically 1–3 years, as printed on the Revenue document).
Creating a 56B certificate
Set country: "IE", certificateType: "EXPORT_AUTHORIZATION", and formType: "56B". Omit region — Section 56 authorisations are national. Use the expiry date printed on the Revenue authorisation for effectiveTo.
curl https://api.clearvo.io/v1/tax/exemptions \
-X POST \
-H "x-api-key: csk_live_..." \
-H "Content-Type: application/json" \
-d '{
"certificateRef": "CERT-IE-EXPORTER-2026",
"customerRef": "CUST-4471",
"customerName": "Kilkenny Precision Exports Ltd",
"certificateType": "EXPORT_AUTHORIZATION",
"formType": "56B",
"country": "IE",
"effectiveFrom": "2026-01-01",
"effectiveTo": "2028-12-31"
}'
{
"certificate": {
"id": "ecm_03m2...",
"certificateRef": "CERT-IE-EXPORTER-2026",
"customerRef": "CUST-4471",
"customerName": "Kilkenny Precision Exports Ltd",
"certificateType": "EXPORT_AUTHORIZATION",
"formType": "56B",
"country": "IE",
"regions": [],
"effectiveFrom": "2026-01-01",
"effectiveTo": "2028-12-31",
"status": "ACTIVE"
}
}
Reference the certificate the same way as any other — pass customer.exemptionRef: "CERT-IE-EXPORTER-2026" on POST /v1/tax/calculate for an Irish transaction, and qualifying line items are zero-rated with tax code E.
Other schemes are not yet supported
Similar authorised-exporter zero-rating schemes exist in other EU countries — for example Italy's plafond IVA / dichiarazione d'intento and France's achat en franchise de TVA — but are not yet implemented. Creating a certificate for a country outside the supported list returns a 400 error naming the unsupported country, rather than silently accepting it.