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 seven exhaustive exclusion grounds. They prevent secrets, internal operating data and data outside the customer's control from crossing the transfer boundary.

  • 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.

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
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
customerSettingspaymentMethodTypestringomitted_when_absentstringfalse
customerSettingsplanstringomitted_when_absentstringfalse
customerSettingsscheduledPlanChangeobjectomitted_when_absentscheduledPlanChangefalse
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
userdisplayUsernamestringomitted_when_absentstringOrNulltrue
useremailstringalwaysstringfalse
useremailVerifiedbooleanalwaysbooleanfalse
useridstringalwaysopaqueReferencefalse
userimagestringomitted_when_absentstringOrNulltrue
usernamestringalwaysstringfalse
userphoneNumberstringomitted_when_absentstringOrNulltrue
userphoneNumberVerifiedbooleanomitted_when_absentbooleanOrNulltrue
usersourceTablestringalwaysstringfalse
userupdatedAtnumberalwaysunixMillisecondsfalse
  • unix_milliseconds
useruserRefstringomitted_when_absentopaqueReferencefalse
userusernamestringomitted_when_absentstringOrNulltrue
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
booleanOrNullunionbooleantrueboolean | null
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
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)
stringscalarstringfalse
stringOrNullunionstringtruestring | null
timeWindowobjectobjectfalse
  • end → string (always)
  • start → string (always)
timeWindowsarrayarrayfalse
  • zero_or_more
  • items → timeWindow
unixMillisecondsscalarnumberfalseunix_milliseconds