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
- Audit readiness score — a 0–100 score across your certificate portfolio, updated in real time as certificates are added, expire, or are renewed
- Gap analysis — identifies buyers with taxable purchases in a jurisdiction where no valid certificate is on file
- 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; the audit score and gap analysis endpoints are under /api/tenant/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 buyer's sales tax permit number or tax ID. Use buyerTaxId for the buyer'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",
"buyerTaxId": "12-3456789",
"certificateType": "MANUFACTURING",
"country": "US",
"region": "TX",
"effectiveFrom": "2026-01-01",
"effectiveTo": "2026-12-31"
}'
{
"id": "cl_cert_01j9...",
"ids": ["cl_cert_01j9..."],
"certificateRef": "CERT-TX-ACME-2026-001",
"customerRef": "cus_abc123",
"customerName": "Acme Manufacturing LLC",
"buyerTaxId": "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 buyer's tax ID. |
| customerRef | string | Yes | Your ERP or billing system reference for the buyer (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 buyer holding the exemption. |
| buyerTaxId | string | No | The buyer's EIN or tax registration number. Stored for audit identification only. |
| certificateType | string | Yes | The exemption basis. One of: RESALE, MANUFACTURING, AGRICULTURAL, ENERGY, EXEMPT_ORG, GOVERNMENT, DIRECT_PAY, BLANKET_OTHER. |
| formType | string | No | Certificate form type: 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. |
| country | string | No | ISO 3166-1 alpha-2 country code. Defaults to "US". |
| region | string | No | Two-letter US state code (e.g. "TX", "CA"). Omit for SST multi-state certificates. |
| 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 validTo 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. |
PENDING | The certificate's validFrom date is in the future. It will become ACTIVE automatically on that date. |
REVOKED | The certificate has been manually revoked via DELETE /v1/tax/exemptions/{id}. Revoked records are retained for audit purposes. |
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 validTo, certificateRef, or reason on an existing certificate. Cannot change buyerTaxId, region, or formType — create a new record instead. |
| DELETE | /v1/tax/exemptions/{id} | Revoke a certificate. Sets status to REVOKED and stops it from being applied to new calculations. The record is retained. |
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,
"currency": "USD",
"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 buyer completes and submits their exemption certificate. You generate a time-limited collection link via the API and send it to the buyer — by email, embedded in your portal, or included on an invoice. When the buyer 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
POST https://api.clearvo.io/v1/tax/exemptions/{id}/collection-link
Where {id} is an existing certificate record ID. If you do not yet have a certificate record for the buyer, create a stub record first (with validFrom and jurisdiction populated but no validTo or certificateRef) and then generate the link against that record.
curl https://api.clearvo.io/v1/tax/exemptions/ecm_01j9.../collection-link \
-X POST \
-H "x-api-key: csk_live_..." \
-H "Content-Type: application/json" \
-d '{
"expiresIn": 604800,
"redirectUrl": "https://yourapp.com/onboarding/complete"
}'
{
"url": "https://app.clearvo.io/collect/tok_abc123xyz",
"token": "tok_abc123xyz",
"expiresAt": "2026-07-03T10:00:00.000Z"
}
Send the url to the buyer. The wizard at app.clearvo.io/collect/{token} is pre-populated with the jurisdiction, form type, and buyer name from the certificate record. The buyer fills in their details, signs, and submits. On submission:
- The certificate record is updated with the submitted data and its status changes to
ACTIVE - A
certificate.collectedwebhook event is sent to your configured endpoint - The buyer is redirected to the
redirectUrlyou specified, if provided
Collection link fields
| Field | Type | Required | Description |
|---|---|---|---|
| expiresIn | integer | No | Seconds until the link expires. Default: 604800 (7 days). Maximum: 2592000 (30 days). After expiry, the link returns a 410 Gone page and the buyer must request a new one. |
| redirectUrl | string | No | A fully qualified URL to redirect the buyer to after successful submission. If omitted, the buyer sees a generic confirmation page. |
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 buyer to initiate renewal. Send a new collection link if the buyer 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...",
"buyerName": "Acme Manufacturing LLC",
"buyerTaxId": "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.
Audit Readiness Score
The audit readiness score is a 0–100 integer that reflects the health of your exemption certificate portfolio at a point in time. It is computed across all exempt transactions for your entity and accounts for missing certificates, expired certificates, and certificates nearing expiry. A score of 100 means every exempt sale can be substantiated with a valid, current certificate. A score below 80 indicates material audit risk.
Endpoint
GET https://api.clearvo.io/api/tenant/exemptions/audit-score
curl https://api.clearvo.io/api/tenant/exemptions/audit-score \
-H "x-api-key: csk_live_..."
{
"score": 84,
"totalExemptTransactions": 312,
"coveredTransactions": 262,
"uncoveredTransactions": 50,
"activeCertificates": 41,
"expiringWithin30Days": 6,
"expiredCertificates": 3,
"gaps": 9,
"calculatedAt": "2026-06-26T10:00:00.000Z"
}
Response fields
| Field | Type | Description |
|---|---|---|
| score | integer | 0–100. The overall audit readiness score for this entity. Scores below 80 represent material risk; below 60 is high risk. |
| totalExemptTransactions | integer | Total number of committed calculations with a tax code of E (exempt) in the entity's history. |
| coveredTransactions | integer | Exempt transactions that have a valid, active certificate on file for the buyer and jurisdiction at the time of the transaction. |
| uncoveredTransactions | integer | Exempt transactions with no matching active certificate. Each of these represents a potential liability if audited. |
| activeCertificates | integer | Total number of certificates in ACTIVE status. |
| expiringWithin30Days | integer | Number of active certificates with a validTo date within the next 30 days. Use this to prioritise renewal outreach. |
| expiredCertificates | integer | Total number of certificates that have transitioned to EXPIRED status. |
| gaps | integer | Number of distinct buyer-jurisdiction pairs where exempt sales have been made but no valid certificate exists. See Gap Analysis for the full list. |
| calculatedAt | string | ISO 8601 timestamp of when the score was computed. |
Gap Analysis
The gap analysis endpoint identifies every buyer-jurisdiction pair where your entity has made exempt sales but does not hold a valid, active certificate. Each gap represents a potential audit finding — the tax authority may assess the uncollected tax plus interest and penalties if you cannot produce a certificate to justify the exemption.
Endpoint
GET https://api.clearvo.io/api/tenant/exemptions/gaps
curl "https://api.clearvo.io/api/tenant/exemptions/gaps?page=1&limit=50" \
-H "x-api-key: csk_live_..."
{
"gaps": [
{
"buyerName": "Delta Supplies Inc",
"buyerTaxId": "98-7654321",
"country": "US",
"region": "CA",
"exemptTransactionCount": 14,
"exemptSalesTotal": 28340.00,
"currency": "USD",
"estimatedTaxExposure": 2919.02,
"oldestExemptSaleDate": "2026-01-08",
"latestExemptSaleDate": "2026-06-22"
}
],
"total": 9,
"page": 1,
"limit": 50
}
Response fields
| Field | Type | Description |
|---|---|---|
| buyerName | string | The buyer's name as recorded on exempt calculations. Matches the name on the certificate record if one exists but has expired or been revoked. |
| buyerTaxId | string | null | The buyer's tax ID as recorded on the calculations, if available. |
| country | string | ISO country code of the jurisdiction where the gap exists. |
| region | string | US state or province code. |
| exemptTransactionCount | integer | Number of committed calculations marked as exempt for this buyer-jurisdiction pair with no valid certificate. |
| exemptSalesTotal | number | Total pre-tax value of the uncertified exempt sales in the transaction currency. |
| estimatedTaxExposure | number | Estimated tax liability if the exemptions are disallowed on audit — computed using the applicable state rate for the jurisdiction. This is an estimate; the actual assessment may differ based on the audit period and penalties applied. |
| oldestExemptSaleDate | string | ISO 8601 date of the earliest uncertified exempt sale for this buyer-jurisdiction pair. Relevant for determining the audit look-back period. |
| latestExemptSaleDate | string | ISO 8601 date of the most recent uncertified exempt sale. |
estimatedTaxExposure descending to address the highest-risk gaps first. For each gap, create a certificate stub record and generate a collection link to send to the buyer — see Buyer Collection Wizard.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 '{
"buyerName": "Horizon Wholesale Corp",
"buyerTaxId": "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...",
"buyerName": "Horizon Wholesale Corp",
"buyerTaxId": "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.