Compliance

OSS threshold monitoring, OSS/IOSS registrations, registration-aware OSS overview behavior, Union OSS report previews, multi-jurisdiction exposure, and accountant export endpoints

Overview

Compliance endpoints help you monitor EU One-Stop Shop (OSS) distance selling thresholds, validate individual consignments against IOSS limits, manage OSS/IOSS scheme registrations, preview Union OSS report outputs, review multi-jurisdiction filing exposure, and download accountant-facing export packages. The authenticated dashboard combines threshold status with tax-registration data to produce a conflict-aware, registration-aware OSS Overview and threshold alerts. Read endpoints require a V2 API key with full or read-only scope; write endpoints require full scope.


OSS / IOSS Tax Registrations

GET /v1/tax-registrations
POST /v1/tax-registrations
PATCH /v1/tax-registrations/{id}

Required scope: full or read-only for GET; full for POST and PATCH

Stores scheme-registration metadata for the authenticated account. Registration records are account-scoped, returned with masked identifiers only, and ordered by most recent effective window. The backend rejects overlapping non-excluded effective windows for the same scheme.

status=ended requires an effective_to date. Use status=excluded to retire stale or duplicate overlapping rows, especially same-start duplicates that should no longer count toward filing coverage.

The dashboard uses the same overlap rule for coverage. Active Union OSS rows with unresolved overlaps are shown as cleanup required and do not count as filing-ready coverage until the duplicate window is ended or excluded.

Registration Fields

FieldTypeDescription
idintegerNumeric registration ID
scheme_typestringunion_oss, non_union_oss, or ioss
member_state_identificationstringEU Member State code used as the Member State of identification
vat_registration_number_maskedstringOptional masked VAT or IOSS identifier; full identifiers are never returned
ioss_intermediary_namestringOptional IOSS intermediary name; only valid for ioss registrations
ioss_intermediary_number_maskedstringOptional masked IOSS intermediary number; only valid for ioss registrations
effective_fromstringStart date (YYYY-MM-DD)
effective_tostringOptional end date (YYYY-MM-DD)
statusstringactive, pending, ended, or excluded

Reporting Eligibility

Union OSS report previews require exactly one overlapping active or ended union_oss registration for the requested quarter. pending, excluded, and conflict-cleanup registrations are visible in registration management responses, but they do not satisfy report-preview eligibility.

Example Request

curl -X POST https://api.vat-engine.daily-automations.app/v1/tax-registrations \-H "X-API-Key: YOUR_API_KEY" \-H "Content-Type: application/json" \-d '{  "scheme_type": "union_oss",  "member_state_identification": "DE",  "effective_from": "2026-01-01",  "status": "active"}'

On PATCH, omit a property to keep its current value. Send an empty string for optional string fields or effective_to to clear the stored value. scheme_type is immutable.


Union OSS Quarterly Summary Preview

GET /v1/reports/oss-quarterly-summary?period=YYYY-Qn

Required scope: full or read-only

Builds a read-only Union OSS quarterly summary preview from filing-grade vat_supply_events. The result is grouped into the Union OSS return sections 2a, 2b, 2c, and 2d.

Inclusion Rules

  • Requires exactly one overlapping active or ended union_oss registration for the requested quarter.
  • Includes sale events as current-quarter return lines.
  • Nets same-quarter corrections back into the current return lines when the refund, cancellation, credit note, or adjustment can be linked to the original filed supply.
  • Emits later-period correction rows keyed by the original OSS period and Member State of consumption when the linked original supply falls in an earlier quarter.
  • Excludes refunds, cancellations, credit notes, and adjustments that cannot be linked to an original filed supply event.
  • Excludes source events whose classification_status is not classified, plus zero-rated, exempt, new-means-of-transport, and assembly/installation supplies.
  • Uses ECB rates from the last day of the quarter when conversion is required, including the return currency of the Member State of identification.
  • Keeps separate rows when more than one actual VAT rate applies within the same standard/reduced return grouping.
  • Computes the payable grand total per Member State of consumption; a negative balance in one Member State does not offset VAT payable in another Member State.

Response Fields

FieldTypeDescription
scheme_typestringAlways union_oss
period_keystringQuarter key such as 2026-Q1
member_state_identificationstringMember State of identification from the eligible registration
return_currencystringFiling currency for the Member State of identification
totalsobjectTaxable, current-VAT, correction-VAT, and payable-VAT totals in return-currency minor units
rowsarrayCurrent-quarter return-line rows grouped by section, country, supply kind, and VAT rate
correctionsarrayLater-period correction rows keyed by original period and Member State of consumption
balancesarrayPer-Member-State current VAT, correction VAT, payable VAT, and grand-total inclusion flag
warningsarrayWarning codes and counts for excluded or blocked source events
total_source_event_countintegerSource events loaded for the quarter
included_source_event_countintegerSource events included in return lines
excluded_source_event_countintegerSource events excluded from return lines

Warning Codes

CodeMeaning
classification_excludedSource events were not classified, including explicitly excluded rows
needs_review_excludedSource events are still marked as needs_review
missing_exchange_rate_excludedRequired quarter-end ECB rates were unavailable
correction_reference_missing_excludedA non-sale event could not be linked to an original filed supply
correction_reference_invalid_excludedA linked original event was not a classified sale or failed correction validation
unsupported_rate_category_excludedRate category does not map to the current OSS preview output
unsupported_supply_kind_excludedSupply kind is unsupported for the current Union OSS preview

Example Request

curl "https://api.vat-engine.daily-automations.app/v1/reports/oss-quarterly-summary?period=2026-Q1" \-H "X-API-Key: YOUR_API_KEY"

Union OSS Country VAT Breakdown Preview

GET /v1/reports/country-vat-breakdown?period=YYYY-Qn

Required scope: full or read-only

Builds a read-only country VAT breakdown using the same inclusion, exclusion, warning, and quarter-end ECB conversion rules as the Union OSS quarterly summary preview. The response groups totals first by Member State of consumption, preserves payable-per-country balances, and nests both current-quarter rows and later-period correction rows for that country.

Response Fields

FieldTypeDescription
scheme_typestringAlways union_oss
period_keystringQuarter key such as 2026-Q1
member_state_identificationstringMember State of identification from the eligible registration
return_currencystringFiling currency for the Member State of identification
totalsobjectTotal taxable, current-VAT, correction-VAT, and payable-VAT amounts across all countries
countriesarrayPer-country totals plus current return-line rows and later-period correction rows
warningsarrayWarning codes and counts shared with the quarterly summary
total_source_event_countintegerSource events loaded for the quarter
included_source_event_countintegerSource events included in country totals
excluded_source_event_countintegerSource events excluded from country totals

Example Request

curl "https://api.vat-engine.daily-automations.app/v1/reports/country-vat-breakdown?period=2026-Q1" \-H "X-API-Key: YOUR_API_KEY"

Union OSS Accountant Exports

GET /v1/reports/oss-quarterly-summary/export?period=YYYY-Qn&format=csv|json
GET /v1/reports/country-vat-breakdown/export?period=YYYY-Qn&format=csv|json

Required scope: full or read-only

The European Commission states that OSS VAT returns are submitted quarterly in the Union scheme via the Member State of identification and are additional to domestic VAT returns. These endpoints export the current Union OSS preview state for accountant review; they do not create or lock a filed return.

Format Behavior

  • format=json returns a manifest plus an export-specific report payload with the same grouping and warnings as the preview, but exported amounts use major-unit decimal strings in the return currency.
  • format=csv returns a line-oriented CSV with manifest metadata repeated on each row, and all exported amount columns use major-unit decimal strings rather than _minor integers.
  • Export packages now include current-quarter rows, later-period correction rows, and per-Member-State payable balances.
  • When a quarter has no included rows, the CSV still emits a deterministic manifest-only nil-return row with empty detail fields so period and warning metadata are preserved.
  • Both exports reuse the same registration eligibility, warnings, exclusions, and quarter-end ECB conversion rules as their source preview.

Amount Fields

All exported amount fields use major units in the return currency, for example 100.00 rather than 10000. This applies to both the JSON package payload and the CSV columns.

Rate Field

Export rows use vat_rate_pct, for example 20.00 or 7.00, instead of the internal vat_rate_bps representation. This matches the existing transaction CSV export convention and is intended for accountant-readable files.

Manifest Fields

FieldTypeDescription
export_kindstringExport shape identifier, e.g. union_oss_quarterly_summary_preview
export_versionintegerPackage schema version
generated_atstringUTC generation timestamp
scheme_typestringAlways union_oss
period_keystringQuarter key such as 2026-Q1
member_state_identificationstringMember State of identification from the eligible registration
return_currencystringFiling currency for the Member State of identification
conversion_rulestringQuarter-end ECB conversion note
scope_notestringPreview scope note describing current-quarter rows, correction rows, and original-reference requirements
source_event_countsobjectTotal, included, and excluded event counts
warningsarrayWarning codes and counts copied from the preview logic

Example Requests

# Quarterly summary JSON packagecurl -L "https://api.vat-engine.daily-automations.app/v1/reports/oss-quarterly-summary/export?period=2026-Q1&format=json" -H "X-API-Key: YOUR_API_KEY"# Country breakdown CSV packagecurl -L "https://api.vat-engine.daily-automations.app/v1/reports/country-vat-breakdown/export?period=2026-Q1&format=csv" -H "X-API-Key: YOUR_API_KEY"

Locked Union OSS Return Periods

GET /v1/reports/locked-return-periods/union-oss?period=YYYY-Qn
POST /v1/reports/locked-return-periods/union-oss?period=YYYY-Qn
POST /v1/reports/locked-return-periods/union-oss/filed?period=YYYY-Qn
GET /v1/reports/locked-return-periods/union-oss/exports/{exportID}

Required scope: full or read-only for GET; full for POST

These endpoints persist and retrieve immutable Union OSS filing snapshots. Locking a quarter freezes the current accountant preview, stores filing metadata, and generates immutable JSON and CSV artifacts for later download. Marking the period as filed preserves the original filing audit state rather than regenerating the snapshot.

Behavior

  • GET /v1/reports/locked-return-periods/union-oss returns the latest locked quarters for the authenticated account.
  • Supplying period=YYYY-Qn adds current_period when that quarter has already been locked, including the immutable export list for that specific quarter.
  • POST /v1/reports/locked-return-periods/union-oss creates the immutable snapshot from the current preview and fails with 409 if the quarter is already locked.
  • POST /v1/reports/locked-return-periods/union-oss/filed marks an existing locked quarter as filed and keeps the first filing audit metadata on repeat requests.
  • GET /v1/reports/locked-return-periods/union-oss/exports/{exportID} downloads one stored artifact by ID.

Response Fields

FieldTypeDescription
statusstringlocked or filed
filing_statusstringFiling readiness state captured when the quarter was locked
filing_status_detailstringHuman-readable explanation of the captured filing state
nil_return_eligiblebooleanWhether the locked quarter qualified as a nil-return candidate
total_source_event_countintegerSource events evaluated when the snapshot was created
included_source_event_countintegerSource events included in the locked snapshot
excluded_source_event_countintegerSource events excluded from the locked snapshot
warning_countintegerCount of captured exclusion or review warnings
jurisdiction_countintegerNumber of reportable Member States represented in the locked quarter
export_countintegerNumber of immutable export artifacts stored for the quarter
exportsarrayOptional stored JSON/CSV artifact metadata when a specific quarter is selected

Example Requests

# List recent locked quarterscurl "https://api.vat-engine.daily-automations.app/v1/reports/locked-return-periods/union-oss" -H "X-API-Key: YOUR_API_KEY"# Lock a quartercurl -X POST "https://api.vat-engine.daily-automations.app/v1/reports/locked-return-periods/union-oss?period=2026-Q1" -H "X-API-Key: YOUR_API_KEY"# Mark the locked quarter as filedcurl -X POST "https://api.vat-engine.daily-automations.app/v1/reports/locked-return-periods/union-oss/filed?period=2026-Q1" -H "X-API-Key: YOUR_API_KEY"

Union OSS Accountant Format

GET /v1/reports/oss-accountant-report?period=YYYY-Qn

Required scope: full or read-only

Returns a combined accountant-friendly Union OSS quarter view for review before filing. It reuses the same quarter preview rules as the summary and country-breakdown endpoints, exposes the export-safe major-unit amount strings and vat_rate_pct values, and includes later-period correction rows plus country-level payable balances in one JSON payload.

Filing Context Rules

  • filing_due_date follows the OSS rule that the return is due by the end of the month following the quarter.
  • nil_return_eligible is intentionally conservative: it is only true when zero source events were recorded for the selected quarter.
  • If source events exist but none are currently included, the response stays in review_required rather than silently treating the quarter as a nil return.
  • The endpoint does not create, lock, or submit a filed return.

Response Shape

FieldTypeDescription
manifestobjectThe same manifest metadata used by the export package
filing_contextobjectDue date plus nil-return/status hint
summaryobjectQuarterly summary totals, current rows, and later-period correction rows using major-unit amounts and vat_rate_pct
country_breakdownobjectCountry totals, nested current rows, and correction rows using the same accountant-readable fields

Example Request

curl "https://api.vat-engine.daily-automations.app/v1/reports/oss-accountant-report?period=2026-Q1" -H "X-API-Key: YOUR_API_KEY"

OSS / IOSS Filing Prep Workspace

GET /v1/reports/filing-prep?period=YYYY-Qn

Required scope: full or read-only

Returns an account-scoped filing workspace for the selected quarter. The response combines Union OSS quarter readiness with month-by-month IOSS summaries derived from committed imported_goods supply events.

Business Rules

  • Union OSS readiness reuses the same preview, warning, nil-return, and payable-balance logic as the existing quarterly summary surface.
  • IOSS months are generated from committed imported-goods supply events only.
  • IOSS exclusions include missing or overlapping registration coverage, excise goods, consignments above EUR 150, non-EUR consignment values that lack a verified EUR value, missing third-country origin, and rows outside the active registration window.
  • Covered months with zero imported-goods source events remain visible as nil_return_candidate because the import scheme return period is monthly.
  • The endpoint does not create, lock, submit, or persist a filed return.

Response Shape

FieldTypeDescription
report_kindstringShape identifier, oss_ioss_filing_prep_workspace
registrationsobjectAccount-level Union OSS / IOSS registration coverage snapshot
union_ossobjectQuarter readiness, due date, totals, and warning categories
iossobjectQuarter-level IOSS month summary status, totals, warnings, and source counts
return_periodobjectOptional locked Union OSS return metadata when the selected quarter is locked
official_basisarrayRule anchors used by the workspace

Example Request

curl "https://api.vat-engine.daily-automations.app/v1/reports/filing-prep?period=2026-Q1" -H "X-API-Key: YOUR_API_KEY"

OSS / IOSS Multi-jurisdiction Preview

GET /v1/reports/multi-jurisdiction?period=YYYY-Qn

Required scope: full or read-only

Returns a read-only filing-exposure view for the selected quarter. The response reuses the existing Union OSS quarterly preview and country-breakdown rules for reportable Member State totals, then adds month-by-month IOSS summaries for committed imported-goods events inside the quarter.

Business Rules

  • Union OSS jurisdiction totals require exactly one overlapping active or ended union_oss registration for the requested quarter.
  • Included Union OSS amounts, exclusions, warnings, correction rows, payable balances, and return-currency conversion match the existing quarterly summary and country VAT breakdown endpoints.
  • Included rows are grouped by Member State of consumption and preserve the Union OSS sections 2a, 2b, 2c, and 2d.
  • IOSS periods are monthly, and each month applies the EUR 150 intrinsic-value ceiling, excise exclusion, registration-window checks, and month-end ECB conversion rules independently.
  • The endpoint does not create, lock, submit, or persist a filed return.

Response Shape

FieldTypeDescription
report_kindstringShape identifier, oss_ioss_multi_jurisdiction_preview
union_ossobjectQuarter context, filing due date, source-event counts, jurisdiction count, and totals
iossobjectMonth-by-month import-scheme statuses, totals, warnings, and imported-goods counts
jurisdictionsarrayMember State of consumption totals with return sections and event counts
warningsarrayWarning codes reused from the Union OSS preview logic
official_basisarrayRule anchors used by the preview

Example Request

curl "https://api.vat-engine.daily-automations.app/v1/reports/multi-jurisdiction?period=2026-Q1" -H "X-API-Key: YOUR_API_KEY"

Threshold Status

GET /v1/compliance/threshold-status

Required scope: full or read-only

Returns the current OSS threshold status for your account based on year-to-date committed, threshold-eligible B2C supply events. Non-EUR amounts are converted to EUR using ECB reference rates where available. Imported goods, non-TBE services, non-sale events, rows awaiting classification, and supplies without the required cross-border evidence are excluded from this threshold slice. IOSS is per-consignment (Art. 369l) and not included in annual cumulative totals — use the Threshold Check endpoint for IOSS validation.

The dashboard OSS Overview combines this endpoint with /v1/tax-registrations and unread threshold-notification state. When turnover is exceeded but an active Union OSS registration is already on file, the dashboard keeps threshold monitoring visible but treats the account as already covered for Union OSS filing.

POST /v1/vat/calculate does not update this threshold view by itself. The threshold status is built from committed supply events, while VAT calculations are logged separately as audit transactions unless the same sale is also committed into the supply ledger.

Response Fields

FieldTypeDescription
checksarrayArray of threshold check results (OSS only)
periodobjectIncluded period used for the threshold calculation (from / to)
eur_onlybooleantrue if some non-EUR threshold-eligible supply events could not be converted and were excluded
converted_currenciesstring[]Distinct non-EUR currencies successfully converted to EUR
unconverted_currenciesstring[]Distinct non-EUR currencies excluded because no ECB rate was available
disclaimerstringIndicative-only notice about ECB conversion and compliance assumptions

Example Request

curl https://api.vat-engine.daily-automations.app/v1/compliance/threshold-status \-H "X-API-Key: YOUR_API_KEY"

Threshold Check

POST /v1/vat/threshold-check

Required scope: full or read-only

Checks a threshold depending on the type:

  • OSS — Aggregates committed, threshold-eligible B2C supply events over a date range and converts non-EUR rows to EUR using ECB reference rates where available before comparing against the €10 000 annual threshold (Art. 59c). Imported goods, non-TBE services, non-sale events, rows awaiting classification, and supplies without the required cross-border evidence are excluded from this threshold slice.
  • IOSS — Validates a single consignment amount against the €150 threshold (Art. 369l). No transaction aggregation is performed.

Request Body (OSS)

ParameterTypeRequiredDescription
threshold_typestringYes"oss"
fromstringNoStart date (YYYY-MM-DD). Defaults to Jan 1 of current year.
tostringNoEnd date (YYYY-MM-DD). Defaults to today.

Request Body (IOSS)

ParameterTypeRequiredDescription
threshold_typestringYes"ioss"
amount_minorintegerYesConsignment value in EUR minor units (e.g. 15000 = €150.00)

Response Fields

FieldTypeDescription
threshold_typestring"oss" or "ioss"
threshold_minorintegerThreshold amount in EUR minor units
currencystringAlways "EUR"
current_minorintegerAggregated turnover (OSS) or consignment value (IOSS)
remaining_minorintegerAmount remaining before threshold is reached
percentage_usedintegerPercentage of threshold consumed (0-100+)
exceededbooleanWhether the threshold is exceeded
warningbooleantrue when within 10% of threshold but not exceeded
eur_onlybooleantrue if some non-EUR threshold-eligible supply events could not be converted (OSS only)
converted_currenciesstring[]Distinct non-EUR currencies successfully converted to EUR
unconverted_currenciesstring[]Distinct non-EUR currencies excluded because no ECB rate was available
disclaimerstringIndicative-only notice

Example Requests

# OSS — aggregate checkcurl -X POST https://api.vat-engine.daily-automations.app/v1/vat/threshold-check \-H "X-API-Key: YOUR_API_KEY" \-H "Content-Type: application/json" \-d '{"threshold_type": "oss", "from": "2026-01-01", "to": "2026-03-31"}'# IOSS — per-consignment checkcurl -X POST https://api.vat-engine.daily-automations.app/v1/vat/threshold-check \-H "X-API-Key: YOUR_API_KEY" \-H "Content-Type: application/json" \-d '{"threshold_type": "ioss", "amount_minor": 14500}'

OSS threshold comparisons convert non-EUR threshold-eligible supply events to EUR using ECB reference rates where available. The eur_only flag indicates that some rows still had to be excluded because no rate was available.