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
| Field | Type | Description |
|---|---|---|
id | integer | Numeric registration ID |
scheme_type | string | union_oss, non_union_oss, or ioss |
member_state_identification | string | EU Member State code used as the Member State of identification |
vat_registration_number_masked | string | Optional masked VAT or IOSS identifier; full identifiers are never returned |
ioss_intermediary_name | string | Optional IOSS intermediary name; only valid for ioss registrations |
ioss_intermediary_number_masked | string | Optional masked IOSS intermediary number; only valid for ioss registrations |
effective_from | string | Start date (YYYY-MM-DD) |
effective_to | string | Optional end date (YYYY-MM-DD) |
status | string | active, 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-QnRequired 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
activeorendedunion_ossregistration for the requested quarter. - Includes
saleevents 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_statusis notclassified, 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
| Field | Type | Description |
|---|---|---|
scheme_type | string | Always union_oss |
period_key | string | Quarter key such as 2026-Q1 |
member_state_identification | string | Member State of identification from the eligible registration |
return_currency | string | Filing currency for the Member State of identification |
totals | object | Taxable, current-VAT, correction-VAT, and payable-VAT totals in return-currency minor units |
rows | array | Current-quarter return-line rows grouped by section, country, supply kind, and VAT rate |
corrections | array | Later-period correction rows keyed by original period and Member State of consumption |
balances | array | Per-Member-State current VAT, correction VAT, payable VAT, and grand-total inclusion flag |
warnings | array | Warning codes and counts for excluded or blocked source events |
total_source_event_count | integer | Source events loaded for the quarter |
included_source_event_count | integer | Source events included in return lines |
excluded_source_event_count | integer | Source events excluded from return lines |
Warning Codes
| Code | Meaning |
|---|---|
classification_excluded | Source events were not classified, including explicitly excluded rows |
needs_review_excluded | Source events are still marked as needs_review |
missing_exchange_rate_excluded | Required quarter-end ECB rates were unavailable |
correction_reference_missing_excluded | A non-sale event could not be linked to an original filed supply |
correction_reference_invalid_excluded | A linked original event was not a classified sale or failed correction validation |
unsupported_rate_category_excluded | Rate category does not map to the current OSS preview output |
unsupported_supply_kind_excluded | Supply 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-QnRequired 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
| Field | Type | Description |
|---|---|---|
scheme_type | string | Always union_oss |
period_key | string | Quarter key such as 2026-Q1 |
member_state_identification | string | Member State of identification from the eligible registration |
return_currency | string | Filing currency for the Member State of identification |
totals | object | Total taxable, current-VAT, correction-VAT, and payable-VAT amounts across all countries |
countries | array | Per-country totals plus current return-line rows and later-period correction rows |
warnings | array | Warning codes and counts shared with the quarterly summary |
total_source_event_count | integer | Source events loaded for the quarter |
included_source_event_count | integer | Source events included in country totals |
excluded_source_event_count | integer | Source 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|jsonRequired 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=jsonreturns 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=csvreturns a line-oriented CSV with manifest metadata repeated on each row, and all exported amount columns use major-unit decimal strings rather than_minorintegers.- 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
| Field | Type | Description |
|---|---|---|
export_kind | string | Export shape identifier, e.g. union_oss_quarterly_summary_preview |
export_version | integer | Package schema version |
generated_at | string | UTC generation timestamp |
scheme_type | string | Always union_oss |
period_key | string | Quarter key such as 2026-Q1 |
member_state_identification | string | Member State of identification from the eligible registration |
return_currency | string | Filing currency for the Member State of identification |
conversion_rule | string | Quarter-end ECB conversion note |
scope_note | string | Preview scope note describing current-quarter rows, correction rows, and original-reference requirements |
source_event_counts | object | Total, included, and excluded event counts |
warnings | array | Warning 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-ossreturns the latest locked quarters for the authenticated account.- Supplying
period=YYYY-Qnaddscurrent_periodwhen that quarter has already been locked, including the immutable export list for that specific quarter. POST /v1/reports/locked-return-periods/union-osscreates the immutable snapshot from the current preview and fails with409if the quarter is already locked.POST /v1/reports/locked-return-periods/union-oss/filedmarks 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
| Field | Type | Description |
|---|---|---|
status | string | locked or filed |
filing_status | string | Filing readiness state captured when the quarter was locked |
filing_status_detail | string | Human-readable explanation of the captured filing state |
nil_return_eligible | boolean | Whether the locked quarter qualified as a nil-return candidate |
total_source_event_count | integer | Source events evaluated when the snapshot was created |
included_source_event_count | integer | Source events included in the locked snapshot |
excluded_source_event_count | integer | Source events excluded from the locked snapshot |
warning_count | integer | Count of captured exclusion or review warnings |
jurisdiction_count | integer | Number of reportable Member States represented in the locked quarter |
export_count | integer | Number of immutable export artifacts stored for the quarter |
exports | array | Optional 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-QnRequired 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_datefollows the OSS rule that the return is due by the end of the month following the quarter.nil_return_eligibleis intentionally conservative: it is onlytruewhen zero source events were recorded for the selected quarter.- If source events exist but none are currently included, the response stays in
review_requiredrather than silently treating the quarter as a nil return. - The endpoint does not create, lock, or submit a filed return.
Response Shape
| Field | Type | Description |
|---|---|---|
manifest | object | The same manifest metadata used by the export package |
filing_context | object | Due date plus nil-return/status hint |
summary | object | Quarterly summary totals, current rows, and later-period correction rows using major-unit amounts and vat_rate_pct |
country_breakdown | object | Country 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-QnRequired 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_candidatebecause the import scheme return period is monthly. - The endpoint does not create, lock, submit, or persist a filed return.
Response Shape
| Field | Type | Description |
|---|---|---|
report_kind | string | Shape identifier, oss_ioss_filing_prep_workspace |
registrations | object | Account-level Union OSS / IOSS registration coverage snapshot |
union_oss | object | Quarter readiness, due date, totals, and warning categories |
ioss | object | Quarter-level IOSS month summary status, totals, warnings, and source counts |
return_period | object | Optional locked Union OSS return metadata when the selected quarter is locked |
official_basis | array | Rule 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-QnRequired 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
activeorendedunion_ossregistration 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, and2d. - 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
| Field | Type | Description |
|---|---|---|
report_kind | string | Shape identifier, oss_ioss_multi_jurisdiction_preview |
union_oss | object | Quarter context, filing due date, source-event counts, jurisdiction count, and totals |
ioss | object | Month-by-month import-scheme statuses, totals, warnings, and imported-goods counts |
jurisdictions | array | Member State of consumption totals with return sections and event counts |
warnings | array | Warning codes reused from the Union OSS preview logic |
official_basis | array | Rule 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-statusRequired 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
| Field | Type | Description |
|---|---|---|
checks | array | Array of threshold check results (OSS only) |
period | object | Included period used for the threshold calculation (from / to) |
eur_only | boolean | true if some non-EUR threshold-eligible supply events could not be converted and were excluded |
converted_currencies | string[] | Distinct non-EUR currencies successfully converted to EUR |
unconverted_currencies | string[] | Distinct non-EUR currencies excluded because no ECB rate was available |
disclaimer | string | Indicative-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-checkRequired 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)
| Parameter | Type | Required | Description |
|---|---|---|---|
threshold_type | string | Yes | "oss" |
from | string | No | Start date (YYYY-MM-DD). Defaults to Jan 1 of current year. |
to | string | No | End date (YYYY-MM-DD). Defaults to today. |
Request Body (IOSS)
| Parameter | Type | Required | Description |
|---|---|---|---|
threshold_type | string | Yes | "ioss" |
amount_minor | integer | Yes | Consignment value in EUR minor units (e.g. 15000 = €150.00) |
Response Fields
| Field | Type | Description |
|---|---|---|
threshold_type | string | "oss" or "ioss" |
threshold_minor | integer | Threshold amount in EUR minor units |
currency | string | Always "EUR" |
current_minor | integer | Aggregated turnover (OSS) or consignment value (IOSS) |
remaining_minor | integer | Amount remaining before threshold is reached |
percentage_used | integer | Percentage of threshold consumed (0-100+) |
exceeded | boolean | Whether the threshold is exceeded |
warning | boolean | true when within 10% of threshold but not exceeded |
eur_only | boolean | true if some non-EUR threshold-eligible supply events could not be converted (OSS only) |
converted_currencies | string[] | Distinct non-EUR currencies successfully converted to EUR |
unconverted_currencies | string[] | Distinct non-EUR currencies excluded because no ECB rate was available |
disclaimer | string | Indicative-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.