Skip to main content

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 profileaccount
  • Availabilityavailability
  • Bookingsbookings
  • Calendar connectionscalendar_sources
  • Email templatesemail_templates
  • Teams and team bookingsteams

Excluded data

The export catalogue uses nine exhaustive exclusion grounds. They prevent secrets, internal operating data and data outside the customer's control from crossing the transfer boundary.

  • defence_record Records Terminaro keeps to answer a disputed direct debit, such as the proof of the SEPA mandate it ran under, are not part of the export.
  • internal_identifier Raw database identifiers are excluded. Exported relationships use deterministic opaque references instead.
  • legacy_unused Unused legacy storage that no production path reads or writes is not part of the export.
  • operational_state Queues, leases, retry state, delivery diagnostics and other transient operating state are excluded.
  • other_data_subject Data controlled by another customer or belonging exclusively to another data subject is not included.
  • provider_internal Provider-only administration and internal business records that are not customer data are excluded.
  • secret_material Passwords, password hashes, authentication secrets and credentials for connected services are not exported.
  • service_integrity Session material, one-time credentials and safeguards used to prevent abuse remain inside the service.
  • statutory_record Records Terminaro must keep to discharge its own legal obligations, such as tax evidence, are not part of the export.

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

  • 200 returns one resource envelope.
  • 400 means the declared length, JSON body, cursor or page size could not be accepted.
  • 401 is the same generic refusal for missing, conflicting, unknown, expired, exhausted or wrong-kind credentials.
  • 429 reports a provider rate limit and includes Retry-After.
  • 500 reports a sanitized internal failure. Error bodies use { "error": "…" }.
  • OPTIONS answers with 204 for 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

Export fields for resource account
Source tableFieldJSON typePresenceShapeNullableCardinality or unit
customerSettingsbillingCountryCodestringomitted_when_absentstringfalse—
customerSettingsbookingPageFallbackLanguagestringomitted_when_absentstringfalse—
customerSettingsbookingUuidstringalwaysstringfalse—
customerSettingscontractAudiencestringomitted_when_absentstringfalse—
customerSettingscreatedAtnumberalwaysunixMillisecondsfalse
  • unix_milliseconds
customerSettingscurrentTermEndnumberomitted_when_absentunixMillisecondsfalse
  • unix_milliseconds
customerSettingsdataExportProviderTokenInstructionsarrayalwaysproviderTokenInstructionsfalse
  • zero_or_more
customerSettingsdisplayNamestringalwaysstringfalse—
customerSettingsdpaAcceptedAtnumberomitted_when_absentunixMillisecondsfalse
  • unix_milliseconds
customerSettingsdpaVersionstringomitted_when_absentstringfalse—
customerSettingsdunningLevelnumberomitted_when_absentnumberfalse—
customerSettingsemailstringalwaysstringfalse—
customerSettingsemailFromstringomitted_when_absentstringfalse—
customerSettingsentitlementsobjectomitted_when_absententitlementsfalse—
customerSettingsfeedReminderMinutesarrayomitted_when_absentarrayOfNumbersfalse
  • zero_or_more
customerSettingshideCustomerNameInFeedbooleanomitted_when_absentbooleanfalse—
customerSettingshideVisitorNamesInFeedbooleanomitted_when_absentbooleanfalse—
customerSettingsidstringalwaysopaqueReferencefalse—
customerSettingslanguagestringomitted_when_absentstringfalse—
customerSettingslastSepaDebitAtnumberomitted_when_absentunixMillisecondsfalse
  • unix_milliseconds
customerSettingslegalImprintTextstringomitted_when_absentstringfalse—
customerSettingslegalImprintUrlstringomitted_when_absentstringfalse—
customerSettingslegalPrivacyTextstringomitted_when_absentstringfalse—
customerSettingslegalPrivacyUrlstringomitted_when_absentstringfalse—
customerSettingsonboardingCompletedAtnumberomitted_when_absentunixMillisecondsfalse
  • unix_milliseconds
customerSettingspaymentGracePeriodEndsAtnumberomitted_when_absentunixMillisecondsfalse
  • unix_milliseconds
customerSettingspaymentInstrumentobjectomitted_when_absentpaymentInstrumentReferencefalse—
customerSettingspaymentMethodTypestringomitted_when_absentstringfalse—
customerSettingsplanstringomitted_when_absentstringfalse—
customerSettingsscheduledPlanChangeobjectomitted_when_absentscheduledPlanChangefalse—
customerSettingsselectedPlanAtRegistrationstringomitted_when_absentstringfalse—
customerSettingsselfServiceRegisteredAtnumberomitted_when_absentunixMillisecondsfalse
  • unix_milliseconds
customerSettingsshowFreeSlotsInFeedbooleanomitted_when_absentbooleanfalse—
customerSettingssourceTablestringalwaysstringfalse—
customerSettingssubscriptionStatusstringomitted_when_absentstringfalse—
customerSettingstermsAcceptedAtnumberomitted_when_absentunixMillisecondsfalse
  • unix_milliseconds
customerSettingstermsVersionstringomitted_when_absentstringfalse—
customerSettingsupdatedAtnumberalwaysunixMillisecondsfalse
  • unix_milliseconds
customerSettingsuserRefstringomitted_when_absentopaqueReferencefalse—
usercreatedAtnumberalwaysunixMillisecondsfalse
  • unix_milliseconds
useremailstringalwaysstringfalse—
useremailVerifiedbooleanalwaysbooleanfalse—
useridstringalwaysopaqueReferencefalse—
userimagestringomitted_when_absentstringOrNulltrue—
usernamestringalwaysstringfalse—
usersourceTablestringalwaysstringfalse—
userupdatedAtnumberalwaysunixMillisecondsfalse
  • unix_milliseconds
useruserRefstringomitted_when_absentopaqueReferencefalse—
legalAcceptancesacceptedAtnumberalwaysunixMillisecondsfalse
  • unix_milliseconds
legalAcceptancescustomerSettingsRefstringalwaysopaqueReferencefalse—
legalAcceptancesdocumentstringalwaysstringfalse—
legalAcceptancesidstringalwaysopaqueReferencefalse—
legalAcceptancessourcestringalwaysstringfalse—
legalAcceptancessourceTablestringalwaysstringfalse—
legalAcceptancesversionstringalwaysstringfalse—

availability

POST /api/export/v1/availability · Availability · single

Export fields for resource availability
Source tableFieldJSON typePresenceShapeNullableCardinality or unit
customerSettingsavailabilityConfirmedAtnumberomitted_when_absentunixMillisecondsfalse
  • unix_milliseconds
customerSettingsbufferMinutesnumberalwaysnumberfalse—
customerSettingsdaysAheadnumberalwaysnumberfalse—
customerSettingsidstringalwaysopaqueReferencefalse—
customerSettingsminLeadTimeMinutesnumberomitted_when_absentnumberfalse—
customerSettingsslotDurationMinutesnumberalwaysnumberfalse—
customerSettingssourceTablestringalwaysstringfalse—
customerSettingstimeWindowsarrayalwaystimeWindowsfalse
  • zero_or_more
customerSettingstimezonestringalwaysstringfalse—
customerSettingsuserRefstringomitted_when_absentopaqueReferencefalse—
customerSettingsworkingDaysarrayalwaysarrayOfNumbersfalse
  • zero_or_more

bookings

POST /api/export/v1/bookings · Bookings · paginated

Export fields for resource bookings
Source tableFieldJSON typePresenceShapeNullableCardinality or unit
bookingscancelledAtnumberomitted_when_absentunixMillisecondsfalse
  • unix_milliseconds
bookingscreatedAtnumberalwaysunixMillisecondsfalse
  • unix_milliseconds
bookingscustomerSettingsRefstringalwaysopaqueReferencefalse—
bookingsendTimenumberalwaysunixMillisecondsfalse
  • unix_milliseconds
bookingsidstringalwaysopaqueReferencefalse—
bookingsoriginalStartTimenumberomitted_when_absentunixMillisecondsfalse
  • unix_milliseconds
bookingspreviousStartTimenumberomitted_when_absentunixMillisecondsfalse
  • unix_milliseconds
bookingsreasonstringomitted_when_absentstringfalse—
bookingsrescheduledAtnumberomitted_when_absentunixMillisecondsfalse
  • unix_milliseconds
bookingssourceTablestringalwaysstringfalse—
bookingsstartTimenumberalwaysunixMillisecondsfalse
  • unix_milliseconds
bookingsstatusstringalwaysstringfalse—
bookingsteamBookingRefstringomitted_when_absentopaqueReferencefalse—
bookingsteamMemberRefstringomitted_when_absentopaqueReferencefalse—
bookingsvisitorCompanystringomitted_when_absentstringfalse—
bookingsvisitorEmailstringalwaysstringfalse—
bookingsvisitorLanguagestringalwaysstringfalse—
bookingsvisitorNamestringalwaysstringfalse—
bookingsvisitorPhonestringomitted_when_absentstringfalse—
bookingsvisitorTimezonestringalwaysstringfalse—

calendar-sources

POST /api/export/v1/calendar-sources · Calendar connections · paginated

Export fields for resource calendar-sources
Source tableFieldJSON typePresenceShapeNullableCardinality or unit
calendarSourcescaldavCalendarUrlstringomitted_when_absentstringfalse—
calendarSourcescaldavUrlstringomitted_when_absentstringfalse—
calendarSourcescaldavUsernamestringomitted_when_absentstringfalse—
calendarSourcescreatedAtnumberalwaysunixMillisecondsfalse
  • unix_milliseconds
calendarSourcescustomerSettingsRefstringalwaysopaqueReferencefalse—
calendarSourcesenabledbooleanalwaysbooleanfalse—
calendarSourcesgoogleAccountKeystringomitted_when_absentstringfalse—
calendarSourcesgoogleCalendarIdstringomitted_when_absentstringfalse—
calendarSourcesidstringalwaysopaqueReferencefalse—
calendarSourceslabelstringalwaysstringfalse—
calendarSourcessourceTablestringalwaysstringfalse—
calendarSourcestypestringalwaysstringfalse—

email-templates

POST /api/export/v1/email-templates · Email templates · single

Export fields for resource email-templates
Source tableFieldJSON typePresenceShapeNullableCardinality or unit
customerSettingsemailTemplateAdminNotificationBodystringomitted_when_absentstringfalse—
customerSettingsemailTemplateAdminNotificationBodyDestringomitted_when_absentstringfalse—
customerSettingsemailTemplateAdminNotificationSubjectstringomitted_when_absentstringfalse—
customerSettingsemailTemplateAdminNotificationSubjectDestringomitted_when_absentstringfalse—
customerSettingsemailTemplateCancellationBodystringomitted_when_absentstringfalse—
customerSettingsemailTemplateCancellationBodyDestringomitted_when_absentstringfalse—
customerSettingsemailTemplateCancellationSubjectstringomitted_when_absentstringfalse—
customerSettingsemailTemplateCancellationSubjectDestringomitted_when_absentstringfalse—
customerSettingsemailTemplateVisitorConfirmationBodystringomitted_when_absentstringfalse—
customerSettingsemailTemplateVisitorConfirmationBodyDestringomitted_when_absentstringfalse—
customerSettingsemailTemplateVisitorConfirmationSubjectstringomitted_when_absentstringfalse—
customerSettingsemailTemplateVisitorConfirmationSubjectDestringomitted_when_absentstringfalse—
customerSettingsidstringalwaysopaqueReferencefalse—
customerSettingssourceTablestringalwaysstringfalse—
customerSettingsuserRefstringomitted_when_absentopaqueReferencefalse—

team-bookings

POST /api/export/v1/team-bookings · Teams and team bookings · paginated

Export fields for resource team-bookings
Source tableFieldJSON typePresenceShapeNullableCardinality or unit
teamBookingsassignedMemberCustomerSettingsRefsarrayalwaysopaqueReferenceArrayfalse
  • zero_or_more
teamBookingsassignedTeamMemberRefsarrayomitted_when_absentopaqueReferenceArrayfalse
  • zero_or_more
teamBookingscancelledAtnumberomitted_when_absentunixMillisecondsfalse
  • unix_milliseconds
teamBookingscreatedAtnumberalwaysunixMillisecondsfalse
  • unix_milliseconds
teamBookingsendTimenumberalwaysunixMillisecondsfalse
  • unix_milliseconds
teamBookingsidstringalwaysopaqueReferencefalse—
teamBookingsreasonstringomitted_when_absentstringfalse—
teamBookingssourceTablestringalwaysstringfalse—
teamBookingsstartTimenumberalwaysunixMillisecondsfalse
  • unix_milliseconds
teamBookingsstatusstringalwaysstringfalse—
teamBookingsteamRefstringalwaysopaqueReferencefalse—
teamBookingsvisitorCompanystringomitted_when_absentstringfalse—
teamBookingsvisitorEmailstringalwaysstringfalse—
teamBookingsvisitorLanguagestringalwaysstringfalse—
teamBookingsvisitorNamestringalwaysstringfalse—
teamBookingsvisitorPhonestringomitted_when_absentstringfalse—
teamBookingsvisitorTimezonestringalwaysstringfalse—

team-members

POST /api/export/v1/team-members · Teams and team bookings · paginated

Export fields for resource team-members
Source tableFieldJSON typePresenceShapeNullableCardinality or unit
teamMembersacceptedAtnumberomitted_when_absentunixMillisecondsfalse
  • unix_milliseconds
teamMembersconsentVersionnumberomitted_when_absentnumberfalse—
teamMemberscreatedAtnumberalwaysunixMillisecondsfalse
  • unix_milliseconds
teamMembersdeactivatedAtnumberomitted_when_absentunixMillisecondsfalse
  • unix_milliseconds
teamMembersidstringalwaysopaqueReferencefalse—
teamMembersinvitedAtnumberomitted_when_absentunixMillisecondsfalse
  • unix_milliseconds
teamMemberslastAssignedAtnumberomitted_when_absentunixMillisecondsfalse
  • unix_milliseconds
teamMembersmemberCustomerSettingsRefstringalwaysopaqueReferencefalse—
teamMembersmemberDisplayNamestringomitted_when_absentstringfalse—
teamMembersmemberEmailstringomitted_when_absentstringfalse—
teamMembersremovalReasonstringomitted_when_absentstringfalse—
teamMembersremovedAtnumberomitted_when_absentunixMillisecondsfalse
  • unix_milliseconds
teamMemberssourceTablestringalwaysstringfalse—
teamMembersstatusstringalwaysstringfalse—
teamMembersteamRefstringalwaysopaqueReferencefalse—
teamMembersupdatedAtnumberalwaysunixMillisecondsfalse
  • unix_milliseconds

teams

POST /api/export/v1/teams · Teams and team bookings · paginated

Export fields for resource teams
Source tableFieldJSON typePresenceShapeNullableCardinality or unit
teamsavailabilityModestringalwaysstringfalse—
teamsbookingPageFallbackLanguagestringomitted_when_absentstringfalse—
teamsbookingUuidstringalwaysstringfalse—
teamscreatedAtnumberalwaysunixMillisecondsfalse
  • unix_milliseconds
teamsdaysAheadnumberalwaysnumberfalse—
teamsdisplayNamestringalwaysstringfalse—
teamsenabledbooleanalwaysbooleanfalse—
teamsidstringalwaysopaqueReferencefalse—
teamsownerCustomerSettingsRefstringalwaysopaqueReferencefalse—
teamsrespectMemberWorkingHoursbooleanalwaysbooleanfalse—
teamsslotDurationMinutesnumberalwaysnumberfalse—
teamssourceTablestringalwaysstringfalse—
teamsteamBufferOverrideMinutesnumberomitted_when_absentnumberfalse—
teamsteamGridBufferMinutesnumberalwaysnumberfalse—
teamsteamMinLeadTimeOverrideMinutesnumberomitted_when_absentnumberfalse—
teamstimeWindowsarrayalwaystimeWindowsfalse
  • zero_or_more
teamstimezonestringalwaysstringfalse—
teamsupdatedAtnumberalwaysunixMillisecondsfalse
  • unix_milliseconds
teamsworkingDaysarrayalwaysarrayOfNumbersfalse
  • zero_or_more

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.

Named JSON shapes referenced by export fields
ShapeKindJSON typeNullableDefinition
arrayOfNumbersarrayarrayfalse
  • zero_or_more
  • items → number
booleanscalarbooleanfalse—
entitlementsobjectobjectfalse
  • customBranding → boolean (always)
  • maxBookingsPerMonth → numberOrNull (always)
  • maxCalendars → number (always)
  • maxTeams → numberOrNull (omitted_when_absent)
nullscalarnulltrue—
numberscalarnumberfalse—
numberOrNullunionnumbertruenumber | null
opaqueReferencescalarstringfalseopaque-reference
opaqueReferenceArrayarrayarrayfalse
  • zero_or_more
  • items → opaqueReference
paymentInstrumentReferenceobjectobjectfalse
  • capturedAt → unixMilliseconds (always)
  • countryCode → string (omitted_when_absent)
  • mandate → sepaMandate (omitted_when_absent)
  • status → string (always)
providerTokenInstructionobjectobjectfalse
  • dpaAcceptedAtAtIssuance → unixMilliseconds (always)
  • dpaVersionAtIssuance → string (always)
  • expiresAt → unixMilliseconds (always)
  • issuedAt → unixMilliseconds (always)
  • issuerEmailSnapshot → string (always)
  • recipientCountryCode → string (always)
  • recipientName → string (always)
  • recipientRole → string (always)
  • scope → string (always)
  • termsAcceptedAtAtIssuance → unixMilliseconds (always)
  • termsVersionAtIssuance → string (always)
  • transferDeclaredAt → unixMilliseconds (always)
  • transferRegion → string (always)
providerTokenInstructionsarrayarrayfalse
  • zero_or_more
  • items → providerTokenInstruction
scheduledPlanChangeobjectobjectfalse
  • effectiveAt → unixMilliseconds (always)
  • targetPlan → string (always)
sepaMandateobjectobjectfalse
  • acceptanceIpAddress → string (omitted_when_absent)
  • acceptanceUserAgent → string (omitted_when_absent)
  • creditorIdentifier → string (always)
  • documentUrl → string (omitted_when_absent)
  • mandateReference → string (always)
  • signedAt → unixMilliseconds (omitted_when_absent)
stringscalarstringfalse—
stringOrNullunionstringtruestring | null
timeWindowobjectobjectfalse
  • end → string (always)
  • start → string (always)
timeWindowsarrayarrayfalse
  • zero_or_more
  • items → timeWindow
unixMillisecondsscalarnumberfalseunix_milliseconds