Data export register
This public register describes the customer data that Terminaro can transfer, the machine-readable interface used for that transfer and the limits that receiving providers need to handle.
Information under Article 26 of Regulation (EU) 2023/2854 (Data Act). This register describes the implemented service; it is not a statement that a particular export is legally sufficient.
Scope of the register
The register covers portable data supplied by the business customer or generated through the customer's use of Terminaro. The exact top-level fields, their JSON shapes and omission rules come from the same catalogue used by the export implementation.
A field marked as omitted when absent does not appear with an invented null value. Arrays state their cardinality, timestamps state their unit and raw internal identifiers are replaced by opaque references.
Exportable data categories
The resource declarations below resolve to six exportable categories. Their field tables are the detailed inventory.
- Account and profile
account - Availability
availability - Bookings
bookings - Calendar connections
calendar_sources - Email templates
email_templates - Teams and team bookings
teams
Excluded data
The export catalogue uses seven exhaustive exclusion grounds. They prevent secrets, internal operating data and data outside the customer's control from crossing the transfer boundary.
internal_identifierRaw database identifiers are excluded. Exported relationships use deterministic opaque references instead.legacy_unusedUnused legacy storage that no production path reads or writes is not part of the export.operational_stateQueues, leases, retry state, delivery diagnostics and other transient operating state are excluded.other_data_subjectData controlled by another customer or belonging exclusively to another data subject is not included.provider_internalProvider-only administration and internal business records that are not customer data are excluded.secret_materialPasswords, password hashes, authentication secrets and credentials for connected services are not exported.service_integritySession material, one-time credentials and safeguards used to prevent abuse remain inside the service.
Historical relationships can be absent when their target was deleted before the export. Already-sent cancellation, reschedule and iCal or feed links stop working after a transfer because the export contains only their digests, never the plaintext secrets needed to use them.
Retention, fees and switching periods
Terminaro charges no fee for the data export or provider transfer. A valid authorized API request starts transferring data immediately. For an ordinary contractual switching process, a notice period of up to two months is followed by a transition period of up to 30 calendar days.
If a switching request cannot technically be completed within 30 calendar days, the contractual technical-exception process can extend the transition to the time required, but to no more than seven months.
Bookings are retained for 90 days after they end. Cancelled team bookings use the cancellation time; other team bookings use their end time. An export contains the records still held when its bounded drain begins, not a permanent account history.
Transfer interface
The resource API is served from https://actions.terminaro.eu. Every declared resource uses POST and sends a JSON object as a text/plain request body, keeping credentials and cursors out of URLs.
A decimal Content-Length header is required before the body is read. The declared and measured body may be at most 4096 bytes. An empty body starts with the defaults.
POST /api/export/v1/account HTTP/1.1
Content-Type: text/plain
Content-Length: 16
x-terminaro-export-ticket: <ticket>
{"pageSize":100}Authentication and rate limits
Every request must send exactly one credential: a first-party paging ticket in x-terminaro-export-ticket or a receiving-provider token in x-terminaro-export-token. Sending neither credential or both credentials is refused.
A paging ticket is valid for 15 minutes and at most 200 requests. One use is spent before rows are read, so a request that later fails and a client retry can each consume a use. The paging ticket is distinct from the single-use browser-download ticket.
Provider tokens have the fixed scope data-export:read:v1. They default to 30 days, may be issued for at most 90 days and are limited to three active tokens per customer.
Provider tokens are server-to-server credentials and must not be embedded in browser code, a public page or a URL. Customers should check Settings → Data export and contact Terminaro if issuance is unavailable. The public register and the customer's own download remain available independently.
Provider traffic is limited to 120 requests per token and 300 requests per customer in each five-minute window. A rate-limited response includes Retry-After.
Responses and errors
200returns one resource envelope.400means the declared length, JSON body, cursor or page size could not be accepted.401is the same generic refusal for missing, conflicting, unknown, expired, exhausted or wrong-kind credentials.429reports a provider rate limit and includesRetry-After.500reports a sanitized internal failure. Error bodies use{ "error": "…" }.OPTIONSanswers with204for the supported cross-origin preflight.
Pagination, consistency and schema support
The optional request fields are cursor and pageSize. Page size defaults to 100 and accepts whole numbers through 500. The account resource can return at most two source rows per page, regardless of the requested size.
Every response contains category, continueCursor, frozenAt, isDone, page, resource, schemaVersion. Single resources finish in one response; paginated resources can return a cursor.
An empty page is not necessarily the end: team-bookings can advance across teams that have no retained bookings and still return a cursor. Stop only when isDone is true and continueCursor is null.
Cursors are opaque but not encrypted. Preserve them exactly.
frozenAt is an upper bound on record creation time for one bounded drain, not a database snapshot. Records created later are excluded, but retained records can still be updated or deleted between page requests.
The current schema major is 1. It appears in both the endpoint path and every response envelope.
Version 1 is the first schema major, so no preceding major or earlier compatibility window exists.
Resources and fields
The implemented transport currently declares 8 resources. These tables are generated from that declaration and its exhaustive field metadata.
Scroll the tables horizontally to see all columns.
account
POST /api/export/v1/account · Account and profile · paginated
| Source table | Field | JSON type | Presence | Shape | Nullable | Cardinality or unit |
|---|---|---|---|---|---|---|
customerSettings | bookingPageFallbackLanguage | string | omitted_when_absent | string | false | — |
customerSettings | bookingUuid | string | always | string | false | — |
customerSettings | contractAudience | string | omitted_when_absent | string | false | — |
customerSettings | createdAt | number | always | unixMilliseconds | false |
|
customerSettings | currentTermEnd | number | omitted_when_absent | unixMilliseconds | false |
|
customerSettings | dataExportProviderTokenInstructions | array | always | providerTokenInstructions | false |
|
customerSettings | displayName | string | always | string | false | — |
customerSettings | dpaAcceptedAt | number | omitted_when_absent | unixMilliseconds | false |
|
customerSettings | dpaVersion | string | omitted_when_absent | string | false | — |
customerSettings | dunningLevel | number | omitted_when_absent | number | false | — |
customerSettings | email | string | always | string | false | — |
customerSettings | emailFrom | string | omitted_when_absent | string | false | — |
customerSettings | entitlements | object | omitted_when_absent | entitlements | false | — |
customerSettings | feedReminderMinutes | array | omitted_when_absent | arrayOfNumbers | false |
|
customerSettings | hideCustomerNameInFeed | boolean | omitted_when_absent | boolean | false | — |
customerSettings | hideVisitorNamesInFeed | boolean | omitted_when_absent | boolean | false | — |
customerSettings | id | string | always | opaqueReference | false | — |
customerSettings | language | string | omitted_when_absent | string | false | — |
customerSettings | lastSepaDebitAt | number | omitted_when_absent | unixMilliseconds | false |
|
customerSettings | legalImprintText | string | omitted_when_absent | string | false | — |
customerSettings | legalImprintUrl | string | omitted_when_absent | string | false | — |
customerSettings | legalPrivacyText | string | omitted_when_absent | string | false | — |
customerSettings | legalPrivacyUrl | string | omitted_when_absent | string | false | — |
customerSettings | onboardingCompletedAt | number | omitted_when_absent | unixMilliseconds | false |
|
customerSettings | paymentGracePeriodEndsAt | number | omitted_when_absent | unixMilliseconds | false |
|
customerSettings | paymentMethodType | string | omitted_when_absent | string | false | — |
customerSettings | plan | string | omitted_when_absent | string | false | — |
customerSettings | scheduledPlanChange | object | omitted_when_absent | scheduledPlanChange | false | — |
customerSettings | selfServiceRegisteredAt | number | omitted_when_absent | unixMilliseconds | false |
|
customerSettings | showFreeSlotsInFeed | boolean | omitted_when_absent | boolean | false | — |
customerSettings | sourceTable | string | always | string | false | — |
customerSettings | subscriptionStatus | string | omitted_when_absent | string | false | — |
customerSettings | termsAcceptedAt | number | omitted_when_absent | unixMilliseconds | false |
|
customerSettings | termsVersion | string | omitted_when_absent | string | false | — |
customerSettings | updatedAt | number | always | unixMilliseconds | false |
|
customerSettings | userRef | string | omitted_when_absent | opaqueReference | false | — |
user | createdAt | number | always | unixMilliseconds | false |
|
user | displayUsername | string | omitted_when_absent | stringOrNull | true | — |
user | email | string | always | string | false | — |
user | emailVerified | boolean | always | boolean | false | — |
user | id | string | always | opaqueReference | false | — |
user | image | string | omitted_when_absent | stringOrNull | true | — |
user | name | string | always | string | false | — |
user | phoneNumber | string | omitted_when_absent | stringOrNull | true | — |
user | phoneNumberVerified | boolean | omitted_when_absent | booleanOrNull | true | — |
user | sourceTable | string | always | string | false | — |
user | updatedAt | number | always | unixMilliseconds | false |
|
user | userRef | string | omitted_when_absent | opaqueReference | false | — |
user | username | string | omitted_when_absent | stringOrNull | true | — |
legalAcceptances | acceptedAt | number | always | unixMilliseconds | false |
|
legalAcceptances | customerSettingsRef | string | always | opaqueReference | false | — |
legalAcceptances | document | string | always | string | false | — |
legalAcceptances | id | string | always | opaqueReference | false | — |
legalAcceptances | source | string | always | string | false | — |
legalAcceptances | sourceTable | string | always | string | false | — |
legalAcceptances | version | string | always | string | false | — |
availability
POST /api/export/v1/availability · Availability · single
| Source table | Field | JSON type | Presence | Shape | Nullable | Cardinality or unit |
|---|---|---|---|---|---|---|
customerSettings | availabilityConfirmedAt | number | omitted_when_absent | unixMilliseconds | false |
|
customerSettings | bufferMinutes | number | always | number | false | — |
customerSettings | daysAhead | number | always | number | false | — |
customerSettings | id | string | always | opaqueReference | false | — |
customerSettings | minLeadTimeMinutes | number | omitted_when_absent | number | false | — |
customerSettings | slotDurationMinutes | number | always | number | false | — |
customerSettings | sourceTable | string | always | string | false | — |
customerSettings | timeWindows | array | always | timeWindows | false |
|
customerSettings | timezone | string | always | string | false | — |
customerSettings | userRef | string | omitted_when_absent | opaqueReference | false | — |
customerSettings | workingDays | array | always | arrayOfNumbers | false |
|
bookings
POST /api/export/v1/bookings · Bookings · paginated
| Source table | Field | JSON type | Presence | Shape | Nullable | Cardinality or unit |
|---|---|---|---|---|---|---|
bookings | cancelledAt | number | omitted_when_absent | unixMilliseconds | false |
|
bookings | createdAt | number | always | unixMilliseconds | false |
|
bookings | customerSettingsRef | string | always | opaqueReference | false | — |
bookings | endTime | number | always | unixMilliseconds | false |
|
bookings | id | string | always | opaqueReference | false | — |
bookings | originalStartTime | number | omitted_when_absent | unixMilliseconds | false |
|
bookings | previousStartTime | number | omitted_when_absent | unixMilliseconds | false |
|
bookings | reason | string | omitted_when_absent | string | false | — |
bookings | rescheduledAt | number | omitted_when_absent | unixMilliseconds | false |
|
bookings | sourceTable | string | always | string | false | — |
bookings | startTime | number | always | unixMilliseconds | false |
|
bookings | status | string | always | string | false | — |
bookings | teamBookingRef | string | omitted_when_absent | opaqueReference | false | — |
bookings | teamMemberRef | string | omitted_when_absent | opaqueReference | false | — |
bookings | visitorCompany | string | omitted_when_absent | string | false | — |
bookings | visitorEmail | string | always | string | false | — |
bookings | visitorLanguage | string | always | string | false | — |
bookings | visitorName | string | always | string | false | — |
bookings | visitorPhone | string | omitted_when_absent | string | false | — |
bookings | visitorTimezone | string | always | string | false | — |
calendar-sources
POST /api/export/v1/calendar-sources · Calendar connections · paginated
| Source table | Field | JSON type | Presence | Shape | Nullable | Cardinality or unit |
|---|---|---|---|---|---|---|
calendarSources | caldavCalendarUrl | string | omitted_when_absent | string | false | — |
calendarSources | caldavUrl | string | omitted_when_absent | string | false | — |
calendarSources | caldavUsername | string | omitted_when_absent | string | false | — |
calendarSources | createdAt | number | always | unixMilliseconds | false |
|
calendarSources | customerSettingsRef | string | always | opaqueReference | false | — |
calendarSources | enabled | boolean | always | boolean | false | — |
calendarSources | googleAccountKey | string | omitted_when_absent | string | false | — |
calendarSources | googleCalendarId | string | omitted_when_absent | string | false | — |
calendarSources | id | string | always | opaqueReference | false | — |
calendarSources | label | string | always | string | false | — |
calendarSources | sourceTable | string | always | string | false | — |
calendarSources | type | string | always | string | false | — |
email-templates
POST /api/export/v1/email-templates · Email templates · single
| Source table | Field | JSON type | Presence | Shape | Nullable | Cardinality or unit |
|---|---|---|---|---|---|---|
customerSettings | emailTemplateAdminNotificationBody | string | omitted_when_absent | string | false | — |
customerSettings | emailTemplateAdminNotificationBodyDe | string | omitted_when_absent | string | false | — |
customerSettings | emailTemplateAdminNotificationSubject | string | omitted_when_absent | string | false | — |
customerSettings | emailTemplateAdminNotificationSubjectDe | string | omitted_when_absent | string | false | — |
customerSettings | emailTemplateCancellationBody | string | omitted_when_absent | string | false | — |
customerSettings | emailTemplateCancellationBodyDe | string | omitted_when_absent | string | false | — |
customerSettings | emailTemplateCancellationSubject | string | omitted_when_absent | string | false | — |
customerSettings | emailTemplateCancellationSubjectDe | string | omitted_when_absent | string | false | — |
customerSettings | emailTemplateVisitorConfirmationBody | string | omitted_when_absent | string | false | — |
customerSettings | emailTemplateVisitorConfirmationBodyDe | string | omitted_when_absent | string | false | — |
customerSettings | emailTemplateVisitorConfirmationSubject | string | omitted_when_absent | string | false | — |
customerSettings | emailTemplateVisitorConfirmationSubjectDe | string | omitted_when_absent | string | false | — |
customerSettings | id | string | always | opaqueReference | false | — |
customerSettings | sourceTable | string | always | string | false | — |
customerSettings | userRef | string | omitted_when_absent | opaqueReference | false | — |
team-bookings
POST /api/export/v1/team-bookings · Teams and team bookings · paginated
| Source table | Field | JSON type | Presence | Shape | Nullable | Cardinality or unit |
|---|---|---|---|---|---|---|
teamBookings | assignedMemberCustomerSettingsRefs | array | always | opaqueReferenceArray | false |
|
teamBookings | assignedTeamMemberRefs | array | omitted_when_absent | opaqueReferenceArray | false |
|
teamBookings | cancelledAt | number | omitted_when_absent | unixMilliseconds | false |
|
teamBookings | createdAt | number | always | unixMilliseconds | false |
|
teamBookings | endTime | number | always | unixMilliseconds | false |
|
teamBookings | id | string | always | opaqueReference | false | — |
teamBookings | reason | string | omitted_when_absent | string | false | — |
teamBookings | sourceTable | string | always | string | false | — |
teamBookings | startTime | number | always | unixMilliseconds | false |
|
teamBookings | status | string | always | string | false | — |
teamBookings | teamRef | string | always | opaqueReference | false | — |
teamBookings | visitorCompany | string | omitted_when_absent | string | false | — |
teamBookings | visitorEmail | string | always | string | false | — |
teamBookings | visitorLanguage | string | always | string | false | — |
teamBookings | visitorName | string | always | string | false | — |
teamBookings | visitorPhone | string | omitted_when_absent | string | false | — |
teamBookings | visitorTimezone | string | always | string | false | — |
team-members
POST /api/export/v1/team-members · Teams and team bookings · paginated
| Source table | Field | JSON type | Presence | Shape | Nullable | Cardinality or unit |
|---|---|---|---|---|---|---|
teamMembers | acceptedAt | number | omitted_when_absent | unixMilliseconds | false |
|
teamMembers | consentVersion | number | omitted_when_absent | number | false | — |
teamMembers | createdAt | number | always | unixMilliseconds | false |
|
teamMembers | deactivatedAt | number | omitted_when_absent | unixMilliseconds | false |
|
teamMembers | id | string | always | opaqueReference | false | — |
teamMembers | invitedAt | number | omitted_when_absent | unixMilliseconds | false |
|
teamMembers | lastAssignedAt | number | omitted_when_absent | unixMilliseconds | false |
|
teamMembers | memberCustomerSettingsRef | string | always | opaqueReference | false | — |
teamMembers | memberDisplayName | string | omitted_when_absent | string | false | — |
teamMembers | memberEmail | string | omitted_when_absent | string | false | — |
teamMembers | removalReason | string | omitted_when_absent | string | false | — |
teamMembers | removedAt | number | omitted_when_absent | unixMilliseconds | false |
|
teamMembers | sourceTable | string | always | string | false | — |
teamMembers | status | string | always | string | false | — |
teamMembers | teamRef | string | always | opaqueReference | false | — |
teamMembers | updatedAt | number | always | unixMilliseconds | false |
|
teams
POST /api/export/v1/teams · Teams and team bookings · paginated
| Source table | Field | JSON type | Presence | Shape | Nullable | Cardinality or unit |
|---|---|---|---|---|---|---|
teams | availabilityMode | string | always | string | false | — |
teams | bookingPageFallbackLanguage | string | omitted_when_absent | string | false | — |
teams | bookingUuid | string | always | string | false | — |
teams | createdAt | number | always | unixMilliseconds | false |
|
teams | daysAhead | number | always | number | false | — |
teams | displayName | string | always | string | false | — |
teams | enabled | boolean | always | boolean | false | — |
teams | id | string | always | opaqueReference | false | — |
teams | ownerCustomerSettingsRef | string | always | opaqueReference | false | — |
teams | respectMemberWorkingHours | boolean | always | boolean | false | — |
teams | slotDurationMinutes | number | always | number | false | — |
teams | sourceTable | string | always | string | false | — |
teams | teamBufferOverrideMinutes | number | omitted_when_absent | number | false | — |
teams | teamGridBufferMinutes | number | always | number | false | — |
teams | teamMinLeadTimeOverrideMinutes | number | omitted_when_absent | number | false | — |
teams | timeWindows | array | always | timeWindows | false |
|
teams | timezone | string | always | string | false | — |
teams | updatedAt | number | always | unixMilliseconds | false |
|
teams | workingDays | array | always | arrayOfNumbers | false |
|
JSON shape definitions
Top-level fields refer to these shared definitions. Object members, array items and union variants are listed recursively so receiving providers do not have to infer nested shapes.
Scroll the table horizontally to see all columns.
| Shape | Kind | JSON type | Nullable | Definition |
|---|---|---|---|---|
arrayOfNumbers | array | array | false |
|
boolean | scalar | boolean | false | — |
booleanOrNull | union | boolean | true | boolean | null |
entitlements | object | object | false |
|
null | scalar | null | true | — |
number | scalar | number | false | — |
numberOrNull | union | number | true | number | null |
opaqueReference | scalar | string | false | opaque-reference |
opaqueReferenceArray | array | array | false |
|
providerTokenInstruction | object | object | false |
|
providerTokenInstructions | array | array | false |
|
scheduledPlanChange | object | object | false |
|
string | scalar | string | false | — |
stringOrNull | union | string | true | string | null |
timeWindow | object | object | false |
|
timeWindows | array | array | false |
|
unixMilliseconds | scalar | number | false | unix_milliseconds |