The data export gives you all data Festry holds about your account and the profiles you manage: structured, machine-readable and with all uploaded files in their original form. You start it in your account or through the interface. This page describes the content, structure and fields of the export and serves as the register of data structures and formats under Art. 26(b) Data Act.
Festry assigns all data it holds about an account to thirteen categories. The export follows the same structure: one JSON file per category.
01-account.json
02-profiles.json
03-members.json
04-repertoire.json
05-technical-documents.json
06-events.json
07-tenders.json
08-communication.json
09-public-pages.json
10-billing.json
12-media.json
13-settings.json
Fully included are the profiles you manage as an administrator. Profiles you are only a member of appear in category 1 as a membership; their content is exported by whoever manages them.
The following is not your data or can be recreated from the originals included and is therefore not part of the export:
The export is a ZIP archive. It contains:
README.md explains the export in your language.manifest.json lists the identifier, time, included profiles, the status of each category and every file with size and SHA-256 checksum.01-account.json to 13-settings.json: one file per category. Categories without data are missing; their status is in the manifest.files/ holds the uploaded originals, the archived invoices and calendars in iCalendar format.chat/ holds one folder per event chat with its history, participants, your own read states and attachments.For each file its fields with name, type and whether they can be empty (null). Nested fields are shown with their full path, [] stands for the entries of a list. Placeholders in file paths are in curly braces.
README.mdFormat: Markdown
The explanation of the export in the language of the account: included profiles, structure, formats, categories and what is not included.
manifest.jsonFormat: JSON
The index of the export.
| Field | Type | Can be empty | Explanation |
|---|---|---|---|
| format_version | integer | no | Version of the export format. It increases when the structure changes. |
| export_id | text | no | |
| generated_at | point in time | no | |
| requested_at | point in time | yes | |
| requested_by | object | no | |
| requested_by.user_id | text | no | |
| requested_by.tenant_user_id | text | no | |
| requested_by.email | text | no | |
| profiles | list of object | no | The fully included profiles. |
| profiles[].type | text (artist, promoter) | no | |
| profiles[].id | text | no | |
| profiles[].name | text | yes | |
| locale | text | no | Language of the README and the texts in the export. |
| formats | object with text | no | The formats used, as a short description. |
| categories | list of object | no | |
| categories[].number | integer | no | |
| categories[].key | text | no | |
| categories[].label | text | no | |
| categories[].status | text (included, pending, not_applicable, missing) | no | included (file included), not_applicable (no data of this kind), pending or missing. |
| categories[].file | text | yes | |
| files | list of object | no | Every file under files/ and chat/ with size and checksum. |
| files[].path | text | no | |
| files[].size_bytes | integer | no | |
| files[].sha256 | text | no | SHA-256 checksum of the file, hexadecimal. |
01-account.jsonFormat: JSON · The data of one category. Header and time are at the top, the data under data.: Account and access data
The data of one category. Header and time are at the top, the data under data.
| Field | Type | Can be empty | Explanation |
|---|---|---|---|
| category | object | no | Number, key and name of the category. |
| category.number | integer | no | |
| category.key | text | no | |
| category.label | text | no | |
| generated_at | point in time | no | |
| data | object | no | |
| data.account | object | no | The login account. Password and two-factor secrets are not included. |
| data.account.user_id | text | no | |
| data.account.name | text | no | |
| data.account.email | text | no | |
| data.account.locale | text | yes | Language of the account (de or en). |
| data.account.email_verified_at | point in time | yes | |
| data.account.created_at | point in time | yes | |
| data.account.updated_at | point in time | yes | |
| data.account.two_factor_enabled | boolean | no | |
| data.person | object | no | The person behind the account. |
| data.person.tenant_user_id | text | no | |
| data.person.customer_number | text | yes | |
| data.person.salutation | text | yes | |
| data.person.first_name | text | yes | |
| data.person.last_name | text | yes | |
| data.person.created_at | point in time | yes | |
| data.organisation | object | yes | The organisation the account belongs to. |
| data.organisation.tenant_id | text | no | |
| data.organisation.tenant_number | text | yes | |
| data.organisation.tenant_name | text | yes | |
| data.organisation.address | object | yes | |
| data.organisation.address.salutation | text | yes | |
| data.organisation.address.first_name | text | yes | |
| data.organisation.address.last_name | text | yes | |
| data.organisation.address.company | text | yes | |
| data.organisation.address.vat_number | text | yes | |
| data.organisation.address.street | text | yes | |
| data.organisation.address.street_number | text | yes | |
| data.organisation.address.zip | text | yes | |
| data.organisation.address.city | text | yes | |
| data.organisation.address.country | text | yes | Country as entered, usually as a country code. |
| data.organisation.address.phone | text | yes | |
| data.organisation.address.mobile | text | yes | |
| data.organisation.address.latitude | decimal | yes | Decimal degrees (WGS 84) as text. |
| data.organisation.address.longitude | decimal | yes | Decimal degrees (WGS 84) as text. |
| data.memberships | list of object | no | All profiles the account belongs to, with role. |
| data.memberships[].profile_type | text (artist, promoter) | no | |
| data.memberships[].profile_id | text | no | |
| data.memberships[].profile_name | text | yes | |
| data.memberships[].role | text (admin, manager, member) | no | |
| data.memberships[].joined_at | point in time | yes | |
| data.memberships[].deactivated_at | point in time | yes | |
| data.memberships[].included_in_full | boolean | no | true if the profile is fully included in the export (administrator role). |
| data.billing_addresses | list of object | no | |
| data.billing_addresses[].profile_type | text (artist, promoter) | no | |
| data.billing_addresses[].profile_id | text | no | |
| data.billing_addresses[].salutation | text | yes | |
| data.billing_addresses[].first_name | text | yes | |
| data.billing_addresses[].last_name | text | yes | |
| data.billing_addresses[].company | text | yes | |
| data.billing_addresses[].vat_number | text | yes | |
| data.billing_addresses[].street | text | yes | |
| data.billing_addresses[].street_number | text | yes | |
| data.billing_addresses[].zip | text | yes | |
| data.billing_addresses[].city | text | yes | |
| data.billing_addresses[].country | text | yes | Country as entered, usually as a country code. |
| data.billing_addresses[].phone | text | yes | |
| data.billing_addresses[].mobile | text | yes | |
| data.billing_addresses[].latitude | decimal | yes | Decimal degrees (WGS 84) as text. |
| data.billing_addresses[].longitude | decimal | yes | Decimal degrees (WGS 84) as text. |
| data.invitations_received | list of object | no | |
| data.invitations_received[].invitation_id | text | no | |
| data.invitations_received[].profile_type | text (artist, promoter) | yes | |
| data.invitations_received[].profile_name | text | yes | |
| data.invitations_received[].role | text (admin, manager, member) | no | |
| data.invitations_received[].created_at | point in time | yes | |
| data.invitations_received[].expires_at | point in time | no | |
| data.invitations_received[].accepted_at | point in time | yes | |
| data.invitations_sent | list of object | no | |
| data.invitations_sent[].invitation_id | text | no | |
| data.invitations_sent[].profile_type | text (artist, promoter) | yes | |
| data.invitations_sent[].profile_name | text | yes | |
| data.invitations_sent[].role | text (admin, manager, member) | no | |
| data.invitations_sent[].created_at | point in time | yes | |
| data.invitations_sent[].expires_at | point in time | no | |
| data.invitations_sent[].accepted_at | point in time | yes | |
| data.invitations_sent[].email | text | no | |
| data.data_exports | list of object | no | |
| data.data_exports[].account_data_export_id | text | no | |
| data.data_exports[].status | text (pending, processing, ready, expired, failed) | no | |
| data.data_exports[].created_at | point in time | yes | |
| data.data_exports[].completed_at | point in time | yes | |
| data.data_exports[].expires_at | point in time | yes | |
| data.data_exports[].downloaded_at | point in time | yes | |
| data.terms_acceptances | list of object | no | |
| data.terms_acceptances[].terms_acceptance_id | text | no | |
| data.terms_acceptances[].context | text | no | Where consent was given, e.g. at registration. |
| data.terms_acceptances[].consent_text | text | no | The wording that was agreed to. |
| data.terms_acceptances[].legal_document_id | text | yes | |
| data.terms_acceptances[].terms_revision | integer | yes | |
| data.terms_acceptances[].terms_published_at | point in time | yes | |
| data.terms_acceptances[].locale | text | no | |
| data.terms_acceptances[].accepted_at | point in time | no |
02-profiles.jsonFormat: JSON · The data of one category. Header and time are at the top, the data under data.: Profile and organisation data
The data of one category. Header and time are at the top, the data under data.
| Field | Type | Can be empty | Explanation |
|---|---|---|---|
| category | object | no | Number, key and name of the category. |
| category.number | integer | no | |
| category.key | text | no | |
| category.label | text | no | |
| generated_at | point in time | no | |
| data | object | no | |
| data.artists | list of object | no | |
| data.artists[].artist_id | text | no | |
| data.artists[].name | text | yes | |
| data.artists[].biography | language versions | no | |
| data.artists[].spotify_id | text | yes | |
| data.artists[].social_media_instagram | text | yes | |
| data.artists[].social_media_facebook | text | yes | |
| data.artists[].social_media_tiktok | text | yes | |
| data.artists[].founded_at | point in time | yes | |
| data.artists[].founders | list of text | yes | |
| data.artists[].phone | text | yes | |
| data.artists[].email | text | yes | |
| data.artists[].zip | text | yes | |
| data.artists[].city | text | yes | |
| data.artists[].country | text | yes | Country as entered, usually as a country code. |
| data.artists[].latitude | decimal | yes | Decimal degrees (WGS 84) as text. |
| data.artists[].longitude | decimal | yes | Decimal degrees (WGS 84) as text. |
| data.artists[].available_for_booking | boolean | no | |
| data.artists[].visible_in_search | boolean | no | |
| data.artists[].fee_is_public | boolean | no | |
| data.artists[].created_at | point in time | yes | |
| data.artists[].updated_at | point in time | yes | |
| data.artists[].fee | amount | yes | The fee of the profile; null means by arrangement. |
| data.artists[].genres | list of object | no | |
| data.artists[].genres[].name | text | no | |
| data.artists[].genres[].is_primary | boolean | no | The main genre of the profile. |
| data.artists[].team | list of object | no | The members of the profile with role. |
| data.artists[].team[].name | text | yes | |
| data.artists[].team[].email | text | yes | |
| data.artists[].team[].role | text (admin, manager, member) | no | |
| data.artists[].team[].joined_at | point in time | yes | |
| data.artists[].files | list of text | no | Paths of the related originals in the ZIP. |
| data.promoters | list of object | no | |
| data.promoters[].promoter_id | text | no | |
| data.promoters[].name | text | yes | |
| data.promoters[].contact_first_name | text | yes | |
| data.promoters[].contact_last_name | text | yes | |
| data.promoters[].website_url | text | yes | |
| data.promoters[].created_at | point in time | yes | |
| data.promoters[].updated_at | point in time | yes | |
| data.promoters[].team | list of object | no | The members of the profile with role. |
| data.promoters[].team[].name | text | yes | |
| data.promoters[].team[].email | text | yes | |
| data.promoters[].team[].role | text (admin, manager, member) | no | |
| data.promoters[].team[].joined_at | point in time | yes | |
| data.promoters[].files | list of text | no | Paths of the related originals in the ZIP. |
| data.venues | list of object | no | Venues of your own events, as reference for category 6. |
| data.venues[].location_id | text | no | |
| data.venues[].name | text | no | |
| data.venues[].website | text | yes | |
| data.venues[].email | text | yes | |
| data.venues[].address | object | yes | |
| data.venues[].address.street | text | yes | |
| data.venues[].address.street_number | text | yes | |
| data.venues[].address.zip | text | yes | |
| data.venues[].address.city | text | yes | |
| data.venues[].address.country | text | yes | Country as entered, usually as a country code. |
| data.venues[].address.latitude | decimal | yes | Decimal degrees (WGS 84) as text. |
| data.venues[].address.longitude | decimal | yes | Decimal degrees (WGS 84) as text. |
| data.venues[].stages | list of object | no | |
| data.venues[].stages[].stage_id | text | no | |
| data.venues[].stages[].name | text | no | |
| data.venues[].stages[].capacity | integer | yes |
03-members.jsonFormat: JSON · The data of one category. Header and time are at the top, the data under data.: Member and line-up data
The data of one category. Header and time are at the top, the data under data.
| Field | Type | Can be empty | Explanation |
|---|---|---|---|
| category | object | no | Number, key and name of the category. |
| category.number | integer | no | |
| category.key | text | no | |
| category.label | text | no | |
| generated_at | point in time | no | |
| data | object | no | |
| data.artists | list of object | no | |
| data.artists[].artist_id | text | no | |
| data.artists[].artist_name | text | yes | |
| data.artists[].members | list of object | no | |
| data.artists[].members[].artist_member_id | text | no | |
| data.artists[].members[].name | text | yes | |
| data.artists[].members[].gema_first_name | text | yes | Name for the GEMA report if it differs from the display name. |
| data.artists[].members[].gema_last_name | text | yes | Name for the GEMA report if it differs from the display name. |
| data.artists[].members[].instrument | language versions | no | |
| data.artists[].members[].description | language versions | no | |
| data.artists[].members[].active | boolean | no | |
| data.artists[].members[].created_at | point in time | yes | |
| data.artists[].song_contributors | list of object | no | The contributors to the works of the setlists. |
| data.artists[].song_contributors[].artist_song_contributor_id | text | no | |
| data.artists[].song_contributors[].artist_song_id | text | no | Identifier of a song from category 4. |
| data.artists[].song_contributors[].artist_member_id | text | yes | Identifier of a band member if the contributor is one. |
| data.artists[].song_contributors[].first_name | text | yes | |
| data.artists[].song_contributors[].last_name | text | yes | |
| data.artists[].song_contributors[].type | text (composer, lyricist) | no | composer or lyricist. |
| data.artists[].song_contributors[].gema_relevant | boolean | no | Whether the contribution counts for the GEMA report. |
| data.artists[].song_contributors[].sort_order | integer | no |
04-repertoire.jsonFormat: JSON · The data of one category. Header and time are at the top, the data under data.: Repertoire and works data
The data of one category. Header and time are at the top, the data under data.
| Field | Type | Can be empty | Explanation |
|---|---|---|---|
| category | object | no | Number, key and name of the category. |
| category.number | integer | no | |
| category.key | text | no | |
| category.label | text | no | |
| generated_at | point in time | no | |
| data | object | no | |
| data.artists | list of object | no | |
| data.artists[].artist_id | text | no | |
| data.artists[].artist_name | text | yes | |
| data.artists[].songs | list of object | no | |
| data.artists[].songs[].artist_song_id | text | no | |
| data.artists[].songs[].title | text | no | |
| data.artists[].songs[].key | text | yes | Musical key. |
| data.artists[].songs[].description | text | yes | |
| data.artists[].songs[].duration_seconds | integer | yes | |
| data.artists[].songs[].musician_count | integer | yes | |
| data.artists[].songs[].is_active | boolean | no | |
| data.artists[].songs[].created_at | point in time | yes | |
| data.artists[].setlists | list of object | no | |
| data.artists[].setlists[].artist_setlist_id | text | no | |
| data.artists[].setlists[].name | text | no | |
| data.artists[].setlists[].event_name | text | yes | |
| data.artists[].setlists[].description | text | yes | |
| data.artists[].setlists[].event_id | text | yes | Identifier of an event from category 6. |
| data.artists[].setlists[].created_at | point in time | yes | |
| data.artists[].setlists[].songs | list of object | no | |
| data.artists[].setlists[].songs[].artist_song_id | text | no | Identifier of a song from category 4. |
| data.artists[].setlists[].songs[].satzangabe | text | yes | Arrangement details for the GEMA report. |
| data.artists[].setlists[].songs[].sort_order | integer | no | |
| data.artists[].tracks | list of object | no | Recordings; the audio file is under files in its original form. |
| data.artists[].tracks[].artist_track_id | text | no | |
| data.artists[].tracks[].order | integer | yes | |
| data.artists[].tracks[].title | text | no | |
| data.artists[].tracks[].album | text | yes | |
| data.artists[].tracks[].duration_seconds | integer | yes | |
| data.artists[].tracks[].available_in_profile | boolean | no | |
| data.artists[].tracks[].available_for_application | boolean | no | |
| data.artists[].tracks[].available_on_link_page | boolean | no | |
| data.artists[].tracks[].published_at | point in time | yes | |
| data.artists[].tracks[].created_at | point in time | yes | |
| data.artists[].tracks[].files | list of text | no | Paths of the related originals in the ZIP. |
| data.artists[].videos | list of object | no | |
| data.artists[].videos[].artist_video_id | text | no | |
| data.artists[].videos[].order | integer | yes | |
| data.artists[].videos[].type | text (youtube, vimeo) | no | |
| data.artists[].videos[].title | text | no | |
| data.artists[].videos[].album | text | yes | |
| data.artists[].videos[].platform_id | text | no | Identifier of the video on the platform (e.g. YouTube). |
| data.artists[].videos[].available_in_profile | boolean | no | |
| data.artists[].videos[].available_for_application | boolean | no | |
| data.artists[].videos[].published_at | point in time | yes | |
| data.artists[].videos[].created_at | point in time | yes | |
| data.artists[].tour_dates | list of object | no | |
| data.artists[].tour_dates[].artist_tour_date_id | text | no | |
| data.artists[].tour_dates[].title | text | no | |
| data.artists[].tour_dates[].city | text | yes | |
| data.artists[].tour_dates[].country | text | yes | Country as entered, usually as a country code. |
| data.artists[].tour_dates[].starts_at | point in time | no | |
| data.artists[].tour_dates[].ticket_url | text | yes | |
| data.artists[].tour_dates[].sold_out | boolean | no | |
| data.artists[].tour_dates[].source | text (manual, bandsintown) | no | Where the date comes from: created by hand or imported. |
| data.artists[].tour_dates[].external_id | text | yes | Identifier of the date at the service it was imported from. |
| data.artists[].tour_dates_ics_file | text | yes | Path of the iCalendar file in the ZIP. |
files/tour-dates/{artist_id}.icsFormat: iCalendar · The data of one category. Header and time are at the top, the data under data.: Repertoire and works data
The tour dates of an artist profile as a calendar.
05-technical-documents.jsonFormat: JSON · The data of one category. Header and time are at the top, the data under data.: Technical documents and requirements
The data of one category. Header and time are at the top, the data under data.
| Field | Type | Can be empty | Explanation |
|---|---|---|---|
| category | object | no | Number, key and name of the category. |
| category.number | integer | no | |
| category.key | text | no | |
| category.label | text | no | |
| generated_at | point in time | no | |
| data | object | no | |
| data.artists | list of object | no | |
| data.artists[].artist_id | text | no | |
| data.artists[].artist_name | text | yes | |
| data.artists[].stage_rider | object | yes | |
| data.artists[].stage_rider.source | text (upload, generated) | no | Whether the rider was created in the builder or uploaded as a file. |
| data.artists[].stage_rider.travel_party | JSON | no | The travel party as a list, as entered in the builder. |
| data.artists[].stage_rider.introduction | language versions | no | |
| data.artists[].stage_rider.guestlist | language versions | no | |
| data.artists[].stage_rider.catering | language versions | no | |
| data.artists[].stage_rider.drinks | language versions | no | |
| data.artists[].stage_rider.parking | language versions | no | |
| data.artists[].stage_rider.contact | language versions | no | |
| data.artists[].stage_rider.available_in_press_package | boolean | no | |
| data.artists[].stage_rider.updated_at | point in time | yes | |
| data.artists[].tech_rider | object | yes | |
| data.artists[].tech_rider.source | text (upload, generated) | no | Whether the rider was created in the builder or uploaded as a file. |
| data.artists[].tech_rider.introduction | language versions | no | |
| data.artists[].tech_rider.tech_specs | JSON | no | The technical list as entries with language versions, as entered in the builder. |
| data.artists[].tech_rider.multicore | JSON | no | The channel list as channel and description (language versions). |
| data.artists[].tech_rider.available_in_press_package | boolean | no | |
| data.artists[].tech_rider.updated_at | point in time | yes | |
| data.artists[].hospitality_rider | object | yes | |
| data.artists[].hospitality_rider.source | text (upload, generated) | no | Whether the rider was created in the builder or uploaded as a file. |
| data.artists[].hospitality_rider.introduction | language versions | no | |
| data.artists[].hospitality_rider.catering_items | JSON | no | The catering requests as a list, as entered in the builder. |
| data.artists[].hospitality_rider.accommodation | language versions | no | |
| data.artists[].hospitality_rider.travel_arrival | language versions | no | |
| data.artists[].hospitality_rider.available_in_press_package | boolean | no | |
| data.artists[].hospitality_rider.updated_at | point in time | yes | |
| data.artists[].documents | list of object | no | |
| data.artists[].documents[].artist_document_id | text | no | |
| data.artists[].documents[].type | text (image, contract, bill, id, manual) | no | |
| data.artists[].documents[].title | text | no | |
| data.artists[].documents[].description | text | no | |
| data.artists[].documents[].available_in_presspack | boolean | no | |
| data.artists[].documents[].available_for_application | boolean | no | |
| data.artists[].documents[].created_at | point in time | yes | |
| data.artists[].documents[].files | list of text | no | Paths of the related originals in the ZIP. |
| data.promoters | list of object | no | |
| data.promoters[].promoter_id | text | no | |
| data.promoters[].promoter_name | text | yes | |
| data.promoters[].documents | list of object | no | |
| data.promoters[].documents[].promoter_document_id | text | no | |
| data.promoters[].documents[].type | text (image, contract, bill, id, manual) | no | |
| data.promoters[].documents[].title | text | no | |
| data.promoters[].documents[].description | text | yes | |
| data.promoters[].documents[].created_at | point in time | yes | |
| data.promoters[].documents[].files | list of text | no | Paths of the related originals in the ZIP. |
| data.promoters[].event_documents | list of object | no | |
| data.promoters[].event_documents[].event_document_id | text | no | |
| data.promoters[].event_documents[].event_id | text | no | Identifier of an event from category 6. |
| data.promoters[].event_documents[].type | text (image, contract, bill, id, manual) | no | |
| data.promoters[].event_documents[].title | text | no | |
| data.promoters[].event_documents[].description | text | yes | |
| data.promoters[].event_documents[].created_at | point in time | yes | |
| data.promoters[].event_documents[].files | list of text | no | Paths of the related originals in the ZIP. |
06-events.jsonFormat: JSON · The data of one category. Header and time are at the top, the data under data.: Event and planning data
The data of one category. Header and time are at the top, the data under data.
| Field | Type | Can be empty | Explanation |
|---|---|---|---|
| category | object | no | Number, key and name of the category. |
| category.number | integer | no | |
| category.key | text | no | |
| category.label | text | no | |
| generated_at | point in time | no | |
| data | object | no | |
| data.organised_events | list of object | no | Events of the managed promoter profiles, in full. |
| data.organised_events[].promoter_id | text | no | |
| data.organised_events[].promoter_name | text | yes | |
| data.organised_events[].events | list of object | no | |
| data.organised_events[].events[].event_id | text | no | |
| data.organised_events[].events[].name | text | no | |
| data.organised_events[].events[].description_short | language versions | no | |
| data.organised_events[].events[].description | language versions | no | |
| data.organised_events[].events[].starts_at | point in time | no | |
| data.organised_events[].events[].ends_at | point in time | no | |
| data.organised_events[].events[].ticket_url | text | yes | |
| data.organised_events[].events[].sold_out | boolean | no | |
| data.organised_events[].events[].published | boolean | no | |
| data.organised_events[].events[].cancelled | boolean | no | |
| data.organised_events[].events[].closed | boolean | no | |
| data.organised_events[].events[].created_at | point in time | yes | |
| data.organised_events[].events[].stages | list of object | no | |
| data.organised_events[].events[].stages[].stage_id | text | no | |
| data.organised_events[].events[].stages[].name | text | no | |
| data.organised_events[].events[].stages[].location_id | text | no | Identifier of a venue from category 2. |
| data.organised_events[].events[].artists | list of object | no | |
| data.organised_events[].events[].artists[].artist_id | text | no | |
| data.organised_events[].events[].artists[].artist_name | text | yes | |
| data.organised_events[].events[].artists[].status | text (invited, booked, declined) | no | |
| data.organised_events[].events[].artists[].responded_at | point in time | yes | |
| data.organised_events[].events[].artists[].fee | amount | yes | The fee of this booking; null means by arrangement. |
| data.organised_events[].events[].artists[].proposed_fee | object | yes | An open fee proposal, otherwise null. |
| data.organised_events[].events[].artists[].proposed_fee.fee | amount | yes | |
| data.organised_events[].events[].artists[].proposed_fee.proposed_at | point in time | yes | |
| data.organised_events[].events[].running_order | list of object | no | The running order with performance, changeover and get-in times. |
| data.organised_events[].events[].running_order[].running_order_entry_id | text | no | |
| data.organised_events[].events[].running_order[].stage_id | text | no | |
| data.organised_events[].events[].running_order[].type | text (performance, changeover, get_in) | no | |
| data.organised_events[].events[].running_order[].title | text | yes | |
| data.organised_events[].events[].running_order[].artist_id | text | yes | |
| data.organised_events[].events[].running_order[].starts_at | point in time | no | |
| data.organised_events[].events[].running_order[].ends_at | point in time | yes | |
| data.organised_events[].events[].backline | list of object | no | Equipment needed and who brings it. |
| data.organised_events[].events[].backline[].event_backline_item_id | text | no | |
| data.organised_events[].events[].backline[].name | text | no | |
| data.organised_events[].events[].backline[].quantity_needed | integer | no | |
| data.organised_events[].events[].backline[].assignments | list of object | no | |
| data.organised_events[].events[].backline[].assignments[].artist_id | text | no | |
| data.organised_events[].events[].backline[].assignments[].artist_name | text | yes | |
| data.organised_events[].events[].backline[].assignments[].quantity | integer | no | |
| data.organised_events[].events[].instructions | object | yes | The instructions of the event to the artists. |
| data.organised_events[].events[].instructions.body | text | yes | |
| data.organised_events[].events[].instructions.updated_at | point in time | yes | |
| data.organised_events[].events[].internal_notes | object | yes | The internal note of the promoter side. |
| data.organised_events[].events[].internal_notes.body | text | yes | |
| data.organised_events[].events[].internal_notes.updated_at | point in time | yes | |
| data.organised_events[].events[].declines | list of object | no | |
| data.organised_events[].events[].declines[].artist_id | text | no | |
| data.organised_events[].events[].declines[].artist_name | text | yes | |
| data.organised_events[].events[].declines[].declined_at | point in time | no | |
| data.organised_events[].events[].files | list of text | no | Paths of the related originals in the ZIP. |
| data.participations | list of object | no | Participation of the managed artist profiles in events. |
| data.participations[].artist_id | text | no | |
| data.participations[].artist_name | text | yes | |
| data.participations[].events | list of object | no | |
| data.participations[].events[].event_id | text | no | |
| data.participations[].events[].name | text | no | |
| data.participations[].events[].starts_at | point in time | no | |
| data.participations[].events[].ends_at | point in time | no | |
| data.participations[].events[].cancelled | boolean | no | |
| data.participations[].events[].promoter_name | text | yes | |
| data.participations[].events[].status | text (invited, booked, declined) | no | |
| data.participations[].events[].responded_at | point in time | yes | |
| data.participations[].events[].fee | amount | yes | The fee of this booking; null means by arrangement. |
| data.participations[].events[].proposed_fee | object | yes | An open fee proposal, otherwise null. |
| data.participations[].events[].proposed_fee.fee | amount | yes | |
| data.participations[].events[].proposed_fee.proposed_at | point in time | yes | |
| data.participations[].events[].running_order | list of object | no | |
| data.participations[].events[].running_order[].stage_id | text | no | |
| data.participations[].events[].running_order[].type | text (performance, changeover, get_in) | no | |
| data.participations[].events[].running_order[].title | text | yes | |
| data.participations[].events[].running_order[].starts_at | point in time | no | |
| data.participations[].events[].running_order[].ends_at | point in time | yes | |
| data.participations[].events[].backline | list of object | no | |
| data.participations[].events[].backline[].item | text | yes | |
| data.participations[].events[].backline[].quantity | integer | no | |
| data.participations[].events[].instructions | object | yes | The instructions of the event to the artists. |
| data.participations[].events[].instructions.body | text | yes | |
| data.participations[].events[].instructions.updated_at | point in time | yes | |
| data.participations[].events[].internal_notes | object | yes | The internal note of the artist side. |
| data.participations[].events[].internal_notes.body | text | yes | |
| data.participations[].events[].internal_notes.updated_at | point in time | yes | |
| data.participations[].calendars | list of object | no | |
| data.participations[].calendars[].calendar_id | text | no | |
| data.participations[].calendars[].name | text | no | |
| data.participations[].calendars[].color | text | no | |
| data.participations[].calendars[].type | text (subscription, internal) | no | |
| data.participations[].calendars[].is_published | boolean | no | |
| data.participations[].calendars[].description | text | yes | |
| data.participations[].calendars[].created_at | point in time | yes | |
| data.participations[].calendars[].ics_file | text | no | Path of the iCalendar file in the ZIP. |
| data.participations[].calendars[].entries | list of object | no | |
| data.participations[].calendars[].entries[].calendar_event_id | text | no | |
| data.participations[].calendars[].entries[].title | text | no | |
| data.participations[].calendars[].entries[].description | text | yes | |
| data.participations[].calendars[].entries[].location | text | yes | |
| data.participations[].calendars[].entries[].starts_at | point in time | no | |
| data.participations[].calendars[].entries[].ends_at | point in time | no | |
| data.participations[].calendars[].entries[].all_day | boolean | no | |
| data.participations[].calendars[].entries[].reminder_minutes_before | integer | yes | |
| data.participations[].calendars[].entries[].source | text (imported, manual, festry_booking, running_order) | no | |
| data.participations[].calendars[].entries[].festry_event_id | text | yes | Identifier of an event from category 6. |
files/calendars/{calendar_id}.icsFormat: iCalendar · The data of one category. Header and time are at the top, the data under data.: Event and planning data
A calendar of an artist profile with all entries.
07-tenders.jsonFormat: JSON · The data of one category. Header and time are at the top, the data under data.: Tender and application data
The data of one category. Header and time are at the top, the data under data.
| Field | Type | Can be empty | Explanation |
|---|---|---|---|
| category | object | no | Number, key and name of the category. |
| category.number | integer | no | |
| category.key | text | no | |
| category.label | text | no | |
| generated_at | point in time | no | |
| data | object | no | |
| data.tenders | list of object | no | |
| data.tenders[].promoter_id | text | no | |
| data.tenders[].promoter_name | text | yes | |
| data.tenders[].tenders | list of object | no | |
| data.tenders[].tenders[].event_tender_id | text | no | |
| data.tenders[].tenders[].event_id | text | no | Identifier of an event from category 6. |
| data.tenders[].tenders[].slug | text | no | |
| data.tenders[].tenders[].shortcode | text | no | Short code of the public application address. |
| data.tenders[].tenders[].starts_at | point in time | no | Period in which applications are possible. |
| data.tenders[].tenders[].ends_at | point in time | no | Period in which applications are possible. |
| data.tenders[].tenders[].closed | boolean | no | |
| data.tenders[].tenders[].closed_at | point in time | yes | |
| data.tenders[].tenders[].evaluation_closed_at | point in time | yes | |
| data.tenders[].tenders[].paused | boolean | no | |
| data.tenders[].tenders[].require_youtube | boolean | no | |
| data.tenders[].tenders[].require_social_media | boolean | no | |
| data.tenders[].tenders[].radius_km | integer | yes | Radius in kilometres from which applications may come. |
| data.tenders[].tenders[].created_at | point in time | yes | |
| data.tenders[].tenders[].event_name | text | yes | |
| data.tenders[].tenders[].location | object | yes | |
| data.tenders[].tenders[].location.zip | text | yes | |
| data.tenders[].tenders[].location.city | text | yes | |
| data.tenders[].tenders[].location.country | text | yes | Country as entered, usually as a country code. |
| data.tenders[].tenders[].location.latitude | decimal | yes | Decimal degrees (WGS 84) as text. |
| data.tenders[].tenders[].location.longitude | decimal | yes | Decimal degrees (WGS 84) as text. |
| data.tenders[].tenders[].rating_closures | list of object | no | Who in the team has finished rating. |
| data.tenders[].tenders[].rating_closures[].tenant_user_id | text | no | |
| data.tenders[].tenders[].rating_closures[].closed_at | point in time | no | |
| data.tenders[].tenders[].applications | list of object | no | |
| data.tenders[].tenders[].applications[].event_tender_application_id | text | no | |
| data.tenders[].tenders[].applications[].artist_id | text | yes | Identifier of the artist profile; null for an application without a profile. |
| data.tenders[].tenders[].applications[].email | text | no | |
| data.tenders[].tenders[].applications[].contact_phone | text | no | |
| data.tenders[].tenders[].applications[].external_artist_name | text | yes | The fields external_* come from an application without a profile. |
| data.tenders[].tenders[].applications[].external_description | text | yes | |
| data.tenders[].tenders[].applications[].external_website_url | text | yes | |
| data.tenders[].tenders[].applications[].external_youtube_url | text | yes | |
| data.tenders[].tenders[].applications[].external_instagram | text | yes | |
| data.tenders[].tenders[].applications[].external_facebook | text | yes | |
| data.tenders[].tenders[].applications[].external_tiktok | text | yes | |
| data.tenders[].tenders[].applications[].external_zip | text | yes | |
| data.tenders[].tenders[].applications[].external_city | text | yes | |
| data.tenders[].tenders[].applications[].external_country | text | yes | Country as entered, usually as a country code. |
| data.tenders[].tenders[].applications[].external_latitude | decimal | yes | Decimal degrees (WGS 84) as text. |
| data.tenders[].tenders[].applications[].external_longitude | decimal | yes | Decimal degrees (WGS 84) as text. |
| data.tenders[].tenders[].applications[].overnight_needed | boolean | no | |
| data.tenders[].tenders[].applications[].submitted_at | point in time | no | |
| data.tenders[].tenders[].applications[].status | text (submitted, accepted, rejected, withdrawn) | no | |
| data.tenders[].tenders[].applications[].decided_at | point in time | yes | |
| data.tenders[].tenders[].applications[].decision_note | text | yes | |
| data.tenders[].tenders[].applications[].email_verified_at | point in time | yes | |
| data.tenders[].tenders[].applications[].data_erased_at | point in time | yes | When the details of a closed application were erased. |
| data.tenders[].tenders[].applications[].artist_track_id | text | yes | Identifier of the attached recording from category 4. |
| data.tenders[].tenders[].applications[].proposed_fee | amount | no | The proposed fee of the application. |
| data.tenders[].tenders[].applications[].genres | list of text | no | |
| data.tenders[].tenders[].applications[].files | list of text | no | Paths of the related originals in the ZIP. |
| data.tenders[].tenders[].applications[].ratings | list of object | no | The ratings of the team, 1 to 5 stars. |
| data.tenders[].tenders[].applications[].ratings[].tenant_user_id | text | no | |
| data.tenders[].tenders[].applications[].ratings[].stars | integer | no | |
| data.tenders[].tenders[].applications[].ratings[].created_at | point in time | yes | |
| data.applications_submitted | list of object | no | |
| data.applications_submitted[].artist_id | text | no | |
| data.applications_submitted[].artist_name | text | yes | |
| data.applications_submitted[].applications | list of object | no | |
| data.applications_submitted[].applications[].event_name | text | yes | |
| data.applications_submitted[].applications[].event_starts_at | point in time | yes | |
| data.applications_submitted[].applications[].event_tender_application_id | text | no | |
| data.applications_submitted[].applications[].artist_id | text | yes | Identifier of the artist profile; null for an application without a profile. |
| data.applications_submitted[].applications[].email | text | no | |
| data.applications_submitted[].applications[].contact_phone | text | no | |
| data.applications_submitted[].applications[].external_artist_name | text | yes | The fields external_* come from an application without a profile. |
| data.applications_submitted[].applications[].external_description | text | yes | |
| data.applications_submitted[].applications[].external_website_url | text | yes | |
| data.applications_submitted[].applications[].external_youtube_url | text | yes | |
| data.applications_submitted[].applications[].external_instagram | text | yes | |
| data.applications_submitted[].applications[].external_facebook | text | yes | |
| data.applications_submitted[].applications[].external_tiktok | text | yes | |
| data.applications_submitted[].applications[].external_zip | text | yes | |
| data.applications_submitted[].applications[].external_city | text | yes | |
| data.applications_submitted[].applications[].external_country | text | yes | Country as entered, usually as a country code. |
| data.applications_submitted[].applications[].external_latitude | decimal | yes | Decimal degrees (WGS 84) as text. |
| data.applications_submitted[].applications[].external_longitude | decimal | yes | Decimal degrees (WGS 84) as text. |
| data.applications_submitted[].applications[].overnight_needed | boolean | no | |
| data.applications_submitted[].applications[].submitted_at | point in time | no | |
| data.applications_submitted[].applications[].status | text (submitted, accepted, rejected, withdrawn) | no | |
| data.applications_submitted[].applications[].decided_at | point in time | yes | |
| data.applications_submitted[].applications[].decision_note | text | yes | |
| data.applications_submitted[].applications[].email_verified_at | point in time | yes | |
| data.applications_submitted[].applications[].data_erased_at | point in time | yes | When the details of a closed application were erased. |
| data.applications_submitted[].applications[].artist_track_id | text | yes | Identifier of the attached recording from category 4. |
| data.applications_submitted[].applications[].proposed_fee | amount | no | The proposed fee of the application. |
| data.applications_submitted[].applications[].genres | list of text | no | |
| data.applications_submitted[].applications[].files | list of text | no | Paths of the related originals in the ZIP. |
08-communication.jsonFormat: JSON · The data of one category. Header and time are at the top, the data under data.: Communication data
The data of one category. Header and time are at the top, the data under data.
| Field | Type | Can be empty | Explanation |
|---|---|---|---|
| category | object | no | Number, key and name of the category. |
| category.number | integer | no | |
| category.key | text | no | |
| category.label | text | no | |
| generated_at | point in time | no | |
| data | object | no | |
| data.threads | list of object | no | |
| data.threads[].folder | text | no | The folder of this chat in the ZIP. |
| data.threads[].event | object | no | |
| data.threads[].event.event_id | text | no | |
| data.threads[].event.name | text | no | |
| data.threads[].event.starts_at | point in time | no | |
| data.threads[].own_sides | list of object | no | With which of your own profiles the account takes part in this chat. |
| data.threads[].own_sides[].side | text (promoter, artist) | no | |
| data.threads[].own_sides[].profile | text | no | |
| data.threads[].files | object | no | Paths of the three files of this chat in the ZIP. |
| data.threads[].files.thread | text | no | |
| data.threads[].files.messages | text | no | |
| data.threads[].files.own_state | text | no |
chat/{folder}/thread.jsonFormat: JSON · The data of one category. Header and time are at the top, the data under data.: Communication data
One event chat: the event, your own sides and all participants with joining and leaving.
| Field | Type | Can be empty | Explanation |
|---|---|---|---|
| event | object | no | |
| event.event_id | text | no | |
| event.name | text | no | |
| event.starts_at | point in time | no | |
| own_sides | list of object | no | With which of your own profiles the account takes part in this chat. |
| own_sides[].side | text (promoter, artist) | no | |
| own_sides[].profile | text | no | |
| participants | list of object | no | Everyone involved; of the other side only profile name and side. |
| participants[].profile | text | no | |
| participants[].side | text (promoter, artist) | no | |
| participants[].joined_at | point in time | yes | |
| participants[].left_at | point in time | yes |
chat/{folder}/messages.jsonFormat: JSON · The data of one category. Header and time are at the top, the data under data.: Communication data
All messages of a chat in chronological order. Messages have a sender, system entries the field system_entry instead.
| Field | Type | Can be empty | Explanation |
|---|---|---|---|
| messages | list of object | no | |
| messages[].sent_at | point in time | yes | |
| messages[].type | text (message, system) | no | |
| messages[].system_entry | object | no | Only for system entries: kind and readable text. The field may be missing. |
| messages[].system_entry.type | text (backline_assigned, backline_unassigned) | yes | |
| messages[].system_entry.text | text | yes | |
| messages[].sender | object | no | Only for messages: name, side and profile of the sender. The field may be missing. |
| messages[].sender.name | text | no | |
| messages[].sender.side | text (promoter, artist) | no | |
| messages[].sender.profile | text | yes | |
| messages[].body | text | yes | The field may be missing. |
| messages[].shared_document | object | yes | A document shared from the documents, otherwise null. The field may be missing. |
| messages[].shared_document.title | text | yes | |
| messages[].shared_document.file_name | text | yes | |
| messages[].shared_document.path | text | yes | Path of the file in the ZIP; null if the original is missing. |
| messages[].shared_document.note | text | no | Note if the file is missing or was deleted. The field may be missing. |
| messages[].attachments | list of object | no | The field may be missing. |
| messages[].attachments[].file_name | text | yes | |
| messages[].attachments[].path | text | yes | Path of the file in the ZIP; null if the original is missing. |
| messages[].attachments[].note | text | no | Note if the file is missing or was deleted. The field may be missing. |
chat/{folder}/own-state.jsonFormat: JSON · The data of one category. Header and time are at the top, the data under data.: Communication data
Your own read states and mutes in this chat.
| Field | Type | Can be empty | Explanation |
|---|---|---|---|
| reads | list of object | no | |
| reads[].side | text (promoter, artist) | yes | |
| reads[].profile | text | no | |
| reads[].last_read_at | point in time | yes | |
| mutes | list of object | no | |
| mutes[].side | text (promoter, artist) | yes | |
| mutes[].profile | text | no | |
| mutes[].muted_at | point in time | yes |
chat/{folder}/attachments/{media_id}-{file_name}Format: Original file · The data of one category. Header and time are at the top, the data under data.: Communication data
The attachments and shared documents of a chat in their original form.
09-public-pages.jsonFormat: JSON · The data of one category. Header and time are at the top, the data under data.: Public pages and their reach
The data of one category. Header and time are at the top, the data under data.
| Field | Type | Can be empty | Explanation |
|---|---|---|---|
| category | object | no | Number, key and name of the category. |
| category.number | integer | no | |
| category.key | text | no | |
| category.label | text | no | |
| generated_at | point in time | no | |
| data | object | no | |
| data.link_pages | list of object | no | The Artist-Links of the managed artist profiles. |
| data.link_pages[].artist_id | text | no | |
| data.link_pages[].artist_name | text | yes | |
| data.link_pages[].artist_link_page_id | text | no | |
| data.link_pages[].slug | text | no | The name in the address of the Artist-Links. |
| data.link_pages[].public_id | text | no | The fixed identifier in the address of the Artist-Links. |
| data.link_pages[].is_active | boolean | no | |
| data.link_pages[].primary_color | text | yes | |
| data.link_pages[].custom_title | text | yes | |
| data.link_pages[].use_custom_title | boolean | no | |
| data.link_pages[].use_logo_favicon | boolean | no | |
| data.link_pages[].bandsintown_artist_id | text | yes | |
| data.link_pages[].slug_changed_at | point in time | yes | |
| data.link_pages[].created_at | point in time | yes | |
| data.link_pages[].blocks | list of object | no | |
| data.link_pages[].blocks[].type | text (bio, music_player, videos, tour_dates, press_package, social_links, custom_link) | no | |
| data.link_pages[].blocks[].is_visible | boolean | no | |
| data.link_pages[].blocks[].title | text | yes | |
| data.link_pages[].blocks[].url | text | yes | |
| data.link_pages[].blocks[].icon | text | yes | |
| data.link_pages[].blocks[].order | integer | yes | |
| data.link_pages[].daily_views | list of object | no | Views per day, without reference to visitors. |
| data.link_pages[].daily_views[].date | date | no | |
| data.link_pages[].daily_views[].views | integer | no | |
| data.link_pages[].daily_clicks | list of object | no | Clicks per day and target, without reference to visitors. |
| data.link_pages[].daily_clicks[].date | date | no | |
| data.link_pages[].daily_clicks[].target_type | text (block, social, spotify, press_package) | no | |
| data.link_pages[].daily_clicks[].target_key | text | no | Which target was clicked, e.g. a block or a platform. |
| data.link_pages[].daily_clicks[].clicks | integer | no | |
| data.imprints | list of object | no | The imprint of the Artist-Links. |
| data.imprints[].artist_id | text | no | |
| data.imprints[].artist_name | text | yes | |
| data.imprints[].legal_form | text (natural_person, gbr, registered_merchant, corporation, association, other) | no | |
| data.imprints[].legal_form_other | text | yes | |
| data.imprints[].name | text | yes | |
| data.imprints[].representatives | text | yes | |
| data.imprints[].street | text | yes | |
| data.imprints[].street_number | text | yes | |
| data.imprints[].zip | text | yes | |
| data.imprints[].city | text | yes | |
| data.imprints[].country | text | yes | Country as entered, usually as a country code. |
| data.imprints[].email | text | yes | |
| data.imprints[].phone | text | yes | |
| data.imprints[].register_court | text | yes | |
| data.imprints[].register_number | text | yes | |
| data.imprints[].vat_id | text | yes | |
| data.imprints[].business_id | text | yes | |
| data.imprints[].responsible_name | text | yes | |
| data.imprints[].responsible_address | text | yes | |
| data.imprints[].is_complete | boolean | no | Whether all mandatory details of the imprint are filled in. |
| data.imprints[].created_at | point in time | yes | |
| data.imprints[].updated_at | point in time | yes |
10-billing.jsonFormat: JSON · The data of one category. Header and time are at the top, the data under data.: Contract, billing and payment data
The data of one category. Header and time are at the top, the data under data.
| Field | Type | Can be empty | Explanation |
|---|---|---|---|
| category | object | no | Number, key and name of the category. |
| category.number | integer | no | |
| category.key | text | no | |
| category.label | text | no | |
| generated_at | point in time | no | |
| data | object | no | |
| data.profiles | list of object | no | |
| data.profiles[].profile_type | text (artist, promoter) | no | |
| data.profiles[].profile_id | text | no | |
| data.profiles[].profile_name | text | yes | |
| data.profiles[].subscriptions | list of object | no | |
| data.profiles[].subscriptions[].tenant_subscription_id | text | no | |
| data.profiles[].subscriptions[].contract_number | text | yes | |
| data.profiles[].subscriptions[].status | text | no | Status of the subscription, e.g. active, trialing or canceled. |
| data.profiles[].subscriptions[].current_period_start | point in time | yes | |
| data.profiles[].subscriptions[].current_period_end | point in time | yes | |
| data.profiles[].subscriptions[].trial_ends_at | point in time | yes | |
| data.profiles[].subscriptions[].cancel_at_period_end | boolean | no | |
| data.profiles[].subscriptions[].cancelled_at | point in time | yes | |
| data.profiles[].subscriptions[].ends_at | point in time | yes | |
| data.profiles[].subscriptions[].created_at | point in time | yes | |
| data.profiles[].subscriptions[].plan | text | yes | |
| data.profiles[].subscriptions[].scheduled_plan | text | yes | The plan that will be switched to at the end of the period. |
| data.profiles[].subscriptions[].cancellation | object | yes | |
| data.profiles[].subscriptions[].cancellation.reason | text (dont_want_festry, dont_like_festry, switching_platform, missing_features, platform_problems, other, account_deleted, profile_blocked) | no | |
| data.profiles[].subscriptions[].cancellation.feedback | text | yes | |
| data.profiles[].subscriptions[].cancellation.created_at | point in time | yes | |
| data.profiles[].payment_provider_subscriptions | list of object | no | The subscription at the payment provider Stripe. Payment method data is never held by Festry. |
| data.profiles[].payment_provider_subscriptions[].type | text | no | |
| data.profiles[].payment_provider_subscriptions[].stripe_id | text | yes | |
| data.profiles[].payment_provider_subscriptions[].stripe_status | text | no | |
| data.profiles[].payment_provider_subscriptions[].stripe_price | text | yes | |
| data.profiles[].payment_provider_subscriptions[].quantity | integer | yes | |
| data.profiles[].payment_provider_subscriptions[].trial_ends_at | point in time | yes | |
| data.profiles[].payment_provider_subscriptions[].ends_at | point in time | yes | |
| data.profiles[].payment_provider_subscriptions[].created_at | point in time | yes | |
| data.profiles[].payment_provider_subscriptions[].items | list of object | no | |
| data.profiles[].payment_provider_subscriptions[].items[].stripe_product | text | no | |
| data.profiles[].payment_provider_subscriptions[].items[].stripe_price | text | no | |
| data.profiles[].payment_provider_subscriptions[].items[].quantity | integer | yes | |
| data.profiles[].coupons | list of object | no | |
| data.profiles[].coupons[].duration_amount | integer | no | |
| data.profiles[].coupons[].duration_unit | text (week, month) | no | |
| data.profiles[].coupons[].expires_at | point in time | no | |
| data.profiles[].coupons[].redeemed_at | point in time | yes | |
| data.profiles[].coupons[].plan | text | yes | |
| data.profiles[].invoices | list of object | no | |
| data.profiles[].invoices[].invoice_id | text | no | |
| data.profiles[].invoices[].invoice_number | text | yes | |
| data.profiles[].invoices[].type | text (subscription, one_off) | no | |
| data.profiles[].invoices[].status | text | no | |
| data.profiles[].invoices[].recipient_name | text | yes | |
| data.profiles[].invoices[].recipient_email | text | yes | |
| data.profiles[].invoices[].recipient_address | object with text | yes | The billing address as it appears on the invoice. |
| data.profiles[].invoices[].finalized_at | point in time | yes | |
| data.profiles[].invoices[].paid_at | point in time | yes | |
| data.profiles[].invoices[].amount_paid | amount | no | |
| data.profiles[].invoices[].file | text | yes | Path of the PDF in the ZIP; null if none is archived. |
| data.profiles[].invoices[].credit_notes | list of object | no | |
| data.profiles[].invoices[].credit_notes[].credit_note_id | text | no | |
| data.profiles[].invoices[].credit_notes[].number | text | yes | |
| data.profiles[].invoices[].credit_notes[].memo | text | yes | |
| data.profiles[].invoices[].credit_notes[].credited_at | point in time | yes | |
| data.profiles[].invoices[].credit_notes[].amount | amount | no | |
| data.profiles[].invoices[].credit_notes[].refund_amount | amount | no | |
| data.profiles[].invoices[].credit_notes[].file | text | yes | Path of the PDF in the ZIP; null if none is archived. |
| data.checkout_consents | list of object | no | The consents given when booking a plan, with wording. |
| data.checkout_consents[].checkout_consent_id | text | no | |
| data.checkout_consents[].subscribable_id | text | no | Identifier of the profile the plan was booked for. |
| data.checkout_consents[].plan_name | text | no | |
| data.checkout_consents[].consent_version | text | no | |
| data.checkout_consents[].locale | text | no | |
| data.checkout_consents[].consent_text | text | no | The wording that was agreed to. |
| data.checkout_consents[].consented_at | point in time | no | |
| data.checkout_consents[].terms_version | text | yes | |
| data.checkout_consents[].terms_locale | text | yes | |
| data.checkout_consents[].terms_text | text | yes | |
| data.checkout_consents[].terms_acknowledged_at | point in time | yes | |
| data.contract_declarations | list of object | no | Terminations and withdrawals Festry has assigned to this account. |
| data.contract_declarations[].reference | text | no | |
| data.contract_declarations[].type | text (termination, withdrawal) | no | |
| data.contract_declarations[].termination_kind | text (ordinary, extraordinary) | yes | |
| data.contract_declarations[].extraordinary_reason | text | yes | |
| data.contract_declarations[].contract_description | text | no | |
| data.contract_declarations[].declarant_name | text | no | |
| data.contract_declarations[].declarant_email | text | no | |
| data.contract_declarations[].customer_reference | text | yes | |
| data.contract_declarations[].recognized_customer_number | text | yes | |
| data.contract_declarations[].recognized_contract_number | text | yes | |
| data.contract_declarations[].end_timing | text (next_possible, specific_date) | yes | |
| data.contract_declarations[].desired_end_date | point in time | yes | |
| data.contract_declarations[].confirmation_email | text | no | |
| data.contract_declarations[].received_at | point in time | no | |
| data.contract_declarations[].confirmation_sent_at | point in time | yes | |
| data.contract_declarations[].completion_sent_at | point in time | yes | |
| data.contract_declarations[].contract_ends_at | point in time | yes | |
| data.contract_declarations[].status | text (received, under_review, completed) | no |
files/invoices/{file_name}.pdfFormat: Original file · The data of one category. Header and time are at the top, the data under data.: Contract, billing and payment data
The archived invoices as PDF.
files/credit-notes/{file_name}.pdfFormat: Original file · The data of one category. Header and time are at the top, the data under data.: Contract, billing and payment data
The archived credit notes as PDF.
12-media.jsonFormat: JSON · The data of one category. Header and time are at the top, the data under data.: Media files
The data of one category. Header and time are at the top, the data under data.
| Field | Type | Can be empty | Explanation |
|---|---|---|---|
| category | object | no | Number, key and name of the category. |
| category.number | integer | no | |
| category.key | text | no | |
| category.label | text | no | |
| generated_at | point in time | no | |
| data | object | no | |
| data.files | list of object | no | Every file under files/ and chat/ with size, checksum and origin. |
| data.files[].path | text | no | |
| data.files[].size_bytes | integer | no | |
| data.files[].sha256 | text | no | SHA-256 checksum of the file, hexadecimal. |
| data.files[].media_id | text | no | Identifier of the uploaded file. The following fields are missing for generated files. The field may be missing. |
| data.files[].owner_type | text | no | What the file belongs to, e.g. Artist or ArtistDocument. The field may be missing. |
| data.files[].owner_id | text | no | The field may be missing. |
| data.files[].collection | text | no | What the file was uploaded for, e.g. logo or document. The field may be missing. |
| data.files[].name | text | no | The field may be missing. |
| data.files[].mime_type | text | yes | The field may be missing. |
| data.files[].created_at | point in time | yes | The field may be missing. |
| data.files[].artist_id | text | no | Only for generated files and invoices: what they belong to. The field may be missing. |
| data.files[].calendar_id | text | no | Only for generated files and invoices: what they belong to. The field may be missing. |
| data.files[].invoice_id | text | no | Only for generated files and invoices: what they belong to. The field may be missing. |
| data.files[].invoice_number | text | yes | The field may be missing. |
| data.files[].credit_note_id | text | no | Only for generated files and invoices: what they belong to. The field may be missing. |
| data.files[].credit_note_number | text | yes | The field may be missing. |
files/{collection}/{media_id}/{file_name}Format: Original file · The data of one category. Header and time are at the top, the data under data.: Media files
All uploaded files in their original form: images, logos, documents, recordings and application material. Derived versions such as thumbnails are deliberately missing.
13-settings.jsonFormat: JSON · The data of one category. Header and time are at the top, the data under data.: Settings
The data of one category. Header and time are at the top, the data under data.
| Field | Type | Can be empty | Explanation |
|---|---|---|---|
| category | object | no | Number, key and name of the category. |
| category.number | integer | no | |
| category.key | text | no | |
| category.label | text | no | |
| generated_at | point in time | no | |
| data | object | no | |
| data.locale | text | yes | Language of the account (de or en). |
| data.mail_notifications | list of object | no | Which optional mails the account receives. |
| data.mail_notifications[].mail_type | text (booking-artist-booked, booking-artist-accepted, booking-artist-unbooked, booking-artist-declined, booking-event-cancelled-for-artist, booking-event-deleted, booking-running-order-updated, booking-fee-change-proposed, booking-fee-change-accepted, booking-fee-change-declined, booking-fee-change-reminder, booking-artist-blocked, booking-promoter-blocked, booking-profile-unblocked, booking-performance-cancelled, tender-application-confirmation, tender-application-received, tender-application-accepted, tender-application-rejected, tender-cancelled, tender-new-application, tender-closed, tender-evaluation-phase-started, tender-data-erasure-announced, tender-data-erased) | no | |
| data.mail_notifications[].enabled | boolean | no | |
| data.plan_recommendation_dismissed_at | point in time | yes | When the plan recommendation was last closed. |
Through the interface, a program starts the same export, checks its status and downloads the same ZIP as in your account. It is open and free of charge.
Every request needs an API token in the header Authorization: Bearer <token>. You create it in your account under settings, privacy: https://account.core-119.festry-dev.de/settings/privacy
A token is only good for the data export, is valid for 365 days and can be revoked at any time. You can have at most 5 active tokens. All tokens are deleted with the account.
| Method | Path | Effect |
|---|---|---|
| POST | https://core-119.festry-dev.de/api/v1/data-exports | Starts an export. Response 202 with the export and its status address in the header Location. |
| GET | https://core-119.festry-dev.de/api/v1/data-exports | Your exports, newest first. |
| GET | https://core-119.festry-dev.de/api/v1/data-exports/{id} | The status of an export; when ready, with download address. |
| GET | https://core-119.festry-dev.de/api/v1/data-exports/{id}/download | The ZIP, streamed. The same as the download in your account. |
An export appears as an object under data (for the list as a list):
{
"data": {
"id": "9f1c2d3e-0000-4000-8000-000000000000",
"status": "ready",
"created_at": "2026-10-06T14:30:00+02:00",
"completed_at": "2026-10-06T14:31:12+02:00",
"expires_at": "2026-10-13T14:31:12+02:00",
"size_bytes": 1048576,
"links": {
"self": "https://core-119.festry-dev.de/api/v1/data-exports/9f1c2d3e-0000-4000-8000-000000000000",
"download": "https://core-119.festry-dev.de/api/v1/data-exports/9f1c2d3e-0000-4000-8000-000000000000/download"
}
}
}
200 Success.202 Export started.401 Token missing, expired or revoked.403 Token without the ability data-export.404 Export not found or not yours.409 Download not yet possible (pending) or export failed (failed).410 Export expired, file deleted.429 Cooldown or rate limit.503 Festry is not open right now.Errors always come as JSON with a fixed code and a text in the language from the header Accept-Language (de or en, otherwise de):
{
"error": {
"code": "unauthenticated",
"message": "No valid API token. The token is missing, has expired or was revoked."
}
}
Possible codes: unauthenticated, missing_ability, forbidden, not_found, method_not_allowed, gone, too_many_requests, cooldown, export_expired, export_failed, export_not_ready, platform_closed, service_unavailable, invalid_request, http_error, server_error.
# Start an export
curl -X POST https://core-119.festry-dev.de/api/v1/data-exports \
-H "Authorization: Bearer $FESTRY_TOKEN" \
-H "Accept-Language: en"
# Check the status until status is "ready"
curl https://core-119.festry-dev.de/api/v1/data-exports/{id} \
-H "Authorization: Bearer $FESTRY_TOKEN"
# Download the ZIP
curl -L -o festry-export.zip https://core-119.festry-dev.de/api/v1/data-exports/{id}/download \
-H "Authorization: Bearer $FESTRY_TOKEN"
The same description is available in machine-readable form as JSON Schema (draft 2020-12). Each JSON file of the ZIP has a definition there, x-files maps the paths in the ZIP: https://core-119.festry-dev.de/info/data-export/schema.json