Skip to main content

Overview

The V2 Registration API is the next generation of Commenda’s tax registration system. It introduces enhanced support for international jurisdictions (including EU trade bloc schemes), composite tax types and filing frequencies, and automated condition validation for complex registration rules. V2 registrations use a content-driven approach where each registration is identified by a registration_tax_type_id — a content ID that encodes the jurisdiction, registration type, and tax type combination. The system validates your inputs against the content database to ensure correctness.
Getting started? Use the V2 Content API to discover available jurisdictions, registration options, and conditions before creating registrations.

What’s different from V1

FeatureV1V2
Content identifierregistration_content_idregistration_tax_type_id
Filing frequencySingle string ("QUARTERLY")Array of strings (["QUARTERLY", "ANNUAL_RECONCILIATION"])
Condition validationManualAutomated (prerequisites, mutual exclusivity, EU establishment checks)
EU trade bloc supportBasic (member state linking)Full (Union OSS, Non-Union OSS, IOSS with establishment rules)
Registration conditionsNot exposedQueryable via dedicated endpoint
Tax type detailsNot availableQueryable with descriptions and recommendations

Key concepts

Registration tax type IDs

Each registration option has a unique registration_tax_type_id that encodes the jurisdiction and tax type combination. Examples:
  • REG_STATE_CEN_06_RST — California Retail Sales Tax
  • REG_COUNTRY_DE_3001_VAT — Germany VAT
  • REG_TRADEBLOC_EU_3000_UOSS_VAT — EU Union One-Stop Shop VAT
Use the Available Registrations endpoint to discover these IDs.

Composite tax types

Some registrations require multiple tax types to be filed together. V2 represents these as structured objects:
{
  "primary": "RST",
  "related": [
    { "value": "DTT", "optional": false }
  ]
}
  • Primary — The base tax type (always required)
  • Related with optional: false — Must be included alongside the primary type
  • Related with optional: true — May be included at your discretion
When creating a registration, pass all required tax types in the tax_types array.

Composite filing frequencies

Similarly, some jurisdictions require multiple filing frequencies. V2 represents frequencies as arrays:
{
  "primary": "QUARTERLY",
  "related": [
    { "value": "ANNUAL_RECONCILIATION", "optional": false }
  ]
}
When creating a registration, pass the full set of frequencies in the frequencies array (e.g., ["QUARTERLY", "ANNUAL_RECONCILIATION"]). Available frequency values: MONTHLY, QUARTERLY, SEMI_ANNUALLY, ANNUAL_CALENDAR_YEAR, FISCAL_YEAR, MONTHLY_ACCELERATED_PREPAY_EARLY, QUARTERLY_PREPAY_MONTHLY, ANNUAL_RECONCILIATION, BI_MONTHLY, TRI_ANNUALLY, QUARTERLY_FEB, QUARTERLY_MAR

Registration conditions

V2 introduces queryable conditions that define relationships between registrations:
Condition typeDescription
PREREQUISITE_REGISTRATIONAt least one of the listed registrations must be active before you can create this registration
MUTUALLY_EXCLUSIVEYou cannot hold this registration if any of the listed registrations are active
MUTUALLY_EXCLUSIVE_WITH_MSIBlocks the registration only in the specific member state country you select
MEMBER_COUNTRY_TO_REGISTER_THROUGHYou must choose a member country to register through (for Non-Union OSS, IOSS)
Use the Registration Conditions endpoint to query these before creating a registration.

Registration workflow

Step 1: Discover available jurisdictions

Use the Available Jurisdictions endpoint to find jurisdictions where you can register:
curl --request POST \
  --url 'https://transaction-tax.api.in.commenda.io/api/v1/registrations/v2/content/available-jurisdictions' \
  --header 'Authorization: Bearer <your_token>' \
  --header 'Content-Type: application/json' \
  --data '{
    "filters": {
      "countries": ["US"],
      "types": ["STATE_OR_PROVINCE"]
    },
    "limit": 50
  }'

Step 2: Get registration options

Use the Available Registrations endpoint to get registration_tax_type_id, tax types, and frequencies:
curl --request POST \
  --url 'https://transaction-tax.api.in.commenda.io/api/v1/registrations/v2/content/available-registrations' \
  --header 'Authorization: Bearer <your_token>' \
  --header 'Content-Type: application/json' \
  --data '{
    "jurisdiction_ids": ["JUR_US_STATE_CA"]
  }'

Step 3: Check conditions (if applicable)

For trade bloc or international registrations, check conditions before creating:
curl --request POST \
  --url 'https://transaction-tax.api.in.commenda.io/api/v1/registrations/v2/content/registration-conditions' \
  --header 'Authorization: Bearer <your_token>' \
  --header 'Content-Type: application/json' \
  --data '{
    "registration_tax_type_id": "REG_TRADEBLOC_EU_3000_UOSS_VAT"
  }'

Step 4: Get portal credential requirements

Use the Portal Fields endpoint to understand what credentials are needed:
curl --request POST \
  --url 'https://transaction-tax.api.in.commenda.io/api/v1/registrations/v2/content/portal-fields' \
  --header 'Authorization: Bearer <your_token>' \
  --header 'Content-Type: application/json' \
  --data '{
    "portal_ids": ["PORTAL_CA_CDTFA"]
  }'

Step 5: Create the registration

Use the Create Registration endpoint:
curl --request POST \
  --url 'https://transaction-tax.api.in.commenda.io/api/v1/registrations/v2' \
  --header 'Authorization: Bearer <your_token>' \
  --header 'Content-Type: application/json' \
  --data '{
    "corporation_id": "550e8400-e29b-41d4-a716-446655440000",
    "registration_tax_type_id": "REG_STATE_CEN_06_RST",
    "tax_types": ["RST", "DTT"],
    "frequencies": ["QUARTERLY"],
    "effective_start_date": "2024-01-01"
  }'

EU trade bloc registrations

V2 provides full support for EU One-Stop Shop (OSS) and Import One-Stop Shop (IOSS) registration schemes with automated establishment validation.

Supported schemes

SchemeRegistration tax type ID patternRequirements
Union OSSREG_TRADEBLOC_EU_3000_UOSS_VATQualifying EU establishment in the member state country
Non-Union OSSREG_TRADEBLOC_EU_3000_NUOSS_VATNo qualifying EU establishment in any EU country
IOSSREG_TRADEBLOC_EU_3000_IOSS_VATFor imports of goods valued under €150

Union OSS example

# Create a Union OSS registration linked to a German domestic registration
curl --request POST \
  --url 'https://transaction-tax.api.in.commenda.io/api/v1/registrations/v2' \
  --header 'Authorization: Bearer <your_token>' \
  --header 'Content-Type: application/json' \
  --data '{
    "corporation_id": "550e8400-e29b-41d4-a716-446655440000",
    "registration_tax_type_id": "REG_TRADEBLOC_EU_3000_UOSS_VAT",
    "tax_types": ["VAT"],
    "frequencies": ["QUARTERLY"],
    "member_state_registration_id": "<german_domestic_registration_uuid>"
  }'
The member_state_registration_id must reference an active domestic registration in an EU country where your business has a qualifying establishment (headquarters, branch office, warehouse, factory, retail location, or dependent agent).

Non-Union OSS example

# Create a Non-Union OSS registration through a member country
curl --request POST \
  --url 'https://transaction-tax.api.in.commenda.io/api/v1/registrations/v2' \
  --header 'Authorization: Bearer <your_token>' \
  --header 'Content-Type: application/json' \
  --data '{
    "corporation_id": "550e8400-e29b-41d4-a716-446655440000",
    "registration_tax_type_id": "REG_TRADEBLOC_EU_3000_NUOSS_VAT",
    "tax_types": ["VAT"],
    "frequencies": ["QUARTERLY"],
    "registered_through_registration_tax_type_id": "REG_COUNTRY_DE_3001_VAT"
  }'
Non-Union OSS registration is blocked if your business has any qualifying EU establishment. This is validated automatically when you create the registration.

Registration lifecycle

Status fields

FieldDescriptionValues
validation_statusWhether Commenda has verified your registrationPENDING, VALID, INVALID
registration_statusCurrent stage of the registrationPENDING, ACTIVE, and others

Managing registrations

  • Update — Modify tax types, frequencies, credentials, or other fields
  • Close — Set an effective end date when you stop operating in a jurisdiction
  • Archive — Soft-delete a registration (excluded from calculations and default list views)
  • Delete — Permanently remove a registration (only allowed when validation_status is not VALID)

Sample registration object

{
  "id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
  "corporation_id": "550e8400-e29b-41d4-a716-446655440000",
  "registration_tax_type_id": "REG_STATE_CEN_06_RST",
  "tax_types": ["RST", "DTT"],
  "frequencies": ["QUARTERLY"],
  "jurisdiction_id": "JUR_US_STATE_CA",
  "jurisdiction_name": "California",
  "jurisdiction_type": "STATE_OR_PROVINCE",
  "registration_name": "Sales and Use Tax",
  "effective_start_date": "2024-01-01",
  "registered_by": "COMMENDA",
  "registration_status": "PENDING",
  "validation_status": "PENDING",
  "created_at": "2024-01-15T10:30:00Z"
}

API endpoints

Registration content (discovery)

EndpointMethodDescription
/registrations/v2/content/available-jurisdictionsPOSTSearch for available jurisdictions
/registrations/v2/content/available-registrationsPOSTGet registration options for jurisdictions
/registrations/v2/content/registration-conditionsPOSTGet conditions for a registration type
/registrations/v2/content/portal-fieldsPOSTGet portal credential requirements
/registrations/v2/content/tax-type-detailsPOSTGet tax type descriptions

Registration management

EndpointMethodDescription
/registrations/v2POSTCreate a new registration
/registrations/v2/listPOSTList registrations with filters
/registrations/v2/{id}GETGet a single registration
/registrations/v2/{id}POSTUpdate a registration
/registrations/v2/{id}DELETEDelete a registration

Registration lifecycle

EndpointMethodDescription
/registrations/v2/{id}/archivePOSTArchive a registration
/registrations/v2/{id}/closePOSTClose a registration
/registrations/v2/credentials/by-portal/{portal_id}GETLook up credentials by portal