Alpha testing: all current functionality is free while VAT Engine is in active development

CN and CPA Classification

Validate exact CN/CPA codes, resolve governed tax-class mappings, and submit product-code assignments without treating classification as final VAT treatment.

Boundary

VAT Engine accepts explicit CN and CPA codes only. It does not infer codes from product titles, descriptions, tags, categories, or AI. A resolved mapping is a product-classification input—not a final VAT treatment, rate, place-of-supply, or liability decision.

Approved catalog data is required

VAT Engine does not seed illustrative CN or CPA records as authoritative data. On a fresh or unprovisioned installation, exact-code validation returns 404 catalog_unavailable until an operator imports, reviews, and approves an official catalog covering the requested legal date. Mapping resolution also remains fail-closed until the complete reviewed coverage manifest is published. The examples below show requests to use after those data gates are complete.

Catalog updates and review

Official CN 2021–2026 and CPA 2.1/2.2 catalogs can be acquired and checked through the administrator review workflow. Synchronization prepares candidates; it does not approve them or create VAT mappings. Daily checks must be explicitly enabled. Approval uses a sealed impact preview. If the administrator's recent MFA window has expired, the same review card asks for the current authenticator code and continues with that exact preview; signing out is not required.

A correction remains under review while the previously approved catalog stays available. Once approved, current assignments or classifications that still rely on superseded evidence may require transition review while revalidation runs. Previously sealed historical results retain their original evidence. Catalog approval alone does not publish authoritative tax-class mapping coverage. If an official source row has no legal applicability date, it remains visible for review but cannot become authoritative coverage; its retrieval time is never used as a substitute legal date.

When tax-source review is still required

Approving CN or CPA catalogs validates product codes; it does not decide which VAT treatment applies to a transaction. Source rates restricted to particular codes or additional conditions still need reviewed treatment coverage. A blocked comparison is shown as Not compared, not as a successful comparison with no changes.

The source-review workflow preserves original conditions and distinguishes percentage rates from exemptions, outside-scope treatments, and source not-applicable markers. Those markers must not be interpreted as a universal zero rate or permission to file. Separate evidence is needed for deduction rights and any other tax obligations. Component-aware treatment calculation and its separate approval and activation workflow are available only where reviewed treatment coverage has been explicitly cut over; catalog approval alone does not enable them.

Validate an exact code

GET /v1/classification-codes/{scheme}/{code}?catalog_version=...

Authentication is not required. The optional catalog version must be an approved immutable edition covering the applicable period. Responses include the normalized/display code, official description, source link, catalog digest, applicability, and database-recorded knowledge time.

Examples after catalog approval

Validate a CN code for a legal date

curl "https://api.vat-engine.app/v1/classification-codes/cn/49090000?catalog_version=2026&legal_date=2026-06-01"

Validate a CPA code for a legal date

curl "https://api.vat-engine.app/v1/classification-codes/cpa/58.11.11?catalog_version=2.2&legal_date=2026-06-01"

Before approval, either validation request returns:

{
  "detail": "no approved catalog covers that legal date",
  "error": "catalog_unavailable"
}

Resolve a tax-class mapping

POST /v1/tax-class/resolve
X-API-Key: YOUR_API_KEY
Content-Type: application/json

{
  "scheme": "cn",
  "exact_code": "49090000",
  "catalog_version": "2026",
  "jurisdiction": "DE",
  "legal_date": "2026-06-01"
}

Use a key with classification-resolve or full. Resolution checks the jurisdiction exact rule, its nearest catalog ancestor, then the equivalent EU rules. Review-only, conflicting, withdrawn, unavailable, or unmapped evidence returns needs_review. A resolved response explicitly reports authoritative_for_mapping: true and not_final_tax_treatment: true. It also returns the mapping rule's governed supply_kind; VAT Engine never assumes that every CN code is goods or every CPA code is a service.

Example after coverage publication

curl -X POST https://api.vat-engine.app/v1/tax-class/resolve \-H "X-API-Key: YOUR_API_KEY" \-H "Content-Type: application/json" \-d '{  "scheme": "cn",  "exact_code": "49090000",  "catalog_version": "2026",  "jurisdiction": "DE",  "legal_date": "2026-06-01"}'

Authoritative resolution is enabled only after the complete reviewed CN/CPA coverage set has a published classification_coverage_v1 manifest. Until that gate is complete, exact catalog validation remains available but mapping resolution fails closed with needs_review.

Submit a product-code assignment

POST /v1/integrations/{integration_id}/product-code-assignments
X-API-Key: YOUR_API_KEY
Content-Type: application/json

{
  "scheme": "cpa",
  "exact_code": "58.11.11",
  "product_reference": "gid://shopify/Product/123",
  "variant_reference": null,
  "requested_valid_from": "2026-09-05",
  "requested_valid_to": null
}

Use classification-write or full. Tenant, integration ownership, provenance, timestamps, catalog binding, mappings, and tax classes are derived by the server. An identical retry is idempotent only while that immutable revision remains the current assignment head. Reusing an older request after a successor creates a new revision. When requested_valid_to is omitted for a bounded catalog edition, the server records the catalog's exclusive end date; an explicitly later date is rejected as assignment_outside_catalog_interval. This preserves historical assignments without allowing an expired edition to block its successor. Submitted assignments do not participate until reviewed and validated in Integrations. Backdated entries require an attestation and impact review; archival creates a tombstone successor.

Example after catalog approval

Replace 123 with an integration ID owned by the account represented by the API key.

curl -X POST https://api.vat-engine.app/v1/integrations/123/product-code-assignments \-H "X-API-Key: YOUR_API_KEY" \-H "Content-Type: application/json" \-d '{  "scheme": "cpa",  "exact_code": "58.11.11",  "product_reference": "gid://shopify/Product/123",  "variant_reference": null,  "requested_valid_from": "2026-09-05",  "requested_valid_to": null}'

Every new assignment head and each validated/archived successor enqueue bounded background reprocessing. Each economic order is updated atomically. Locked or filed periods, manually reviewed classifications, inconsistent source scopes, and oversized orders are kept unchanged and routed to correction review.

Publishing the complete coverage manifest also reprocesses affected mappings, including decisions that previously stopped for review while the coverage gate was closed. Assignment validation and archival remain subject to the account's retained revision limit, just like new submissions.

The Integrations assignment list is paginated. Use Load more assignments to continue through all current heads; active records are not hidden behind a fixed dashboard cap. Reprocessing also preserves downstream imported-goods classification when a product mapping is refreshed. If classification authority is removed, VAT Engine restores the persisted Shopify source product facts before applying the replacement decision. Catalog and mapping work is limited to assignment-backed orders or orders carrying a sealed decision from the affected authority.

The governed CN/CPA mapping authority is EU-scoped. Shopify orders whose tax destination is outside the EU bypass assignment resolution and continue through the existing product-classification workflow.

Classification endpoints have dedicated distributed limits in addition to the API key quota. If the distributed limiter is unavailable, they fail closed.