MENU navbar-image

Introduction

This documentation aims to provide all the information you need to work with our API.

Authenticating requests

To authenticate requests, include an Authorization header with the value "Bearer {YOUR_AUTH_KEY}".

All authenticated endpoints are marked with a requires authentication badge in the documentation below.

You can retrieve your token by contacting Crescat on contact@crescat.no.

Group

GET Group Event List

requires authentication

Get array of all events for your group

Example request:
curl --request GET \
    --get "https://app.crescat.io/external/v1/calendar?start=blanditiis&end=dolor" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://app.crescat.io/external/v1/calendar"
);

const params = {
    "start": "blanditiis",
    "end": "dolor",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
 [
   {
     "id": 1,
     "name": "Event Name",
     "start": 2000-01-01 12:00:00,
     "end": 2000-01-01 15:00:00,
     "event_type_id": 1,
     "fields": [
       {
         "id": 1,
         "show_time_id": 1,
         "value": *,
        }
        for details on formatting: see event field format
     ],
     "show_times": [
       {
         "id": 1,
         "title": "Show Title",
         "start": 2000-01-01 12:00:00,
         "end": 2000-01-01 15:00:00,
         "room_id": 1,
        }
     ],
     "rooms": [
       {
         "id": 1,
         "name": "Room Name",
         "title": "Show Title",
         "start": 2000-01-01 12:00:00,
         "end": 2000-01-01 15:00:00,
        }
     ],
   }
 ]
}
 

Request      

GET external/v1/calendar

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

start   string  optional  

Start of dates to query.
If not provided: today.
Format: 2000-01-01 Example: blanditiis

end   string  optional  

End of dates to query.
If not provided: today.
Format: 2000-01-01 Example: dolor

GET Group Event Response Format

requires authentication

Get format of events returned when requesting events

Example request:
curl --request GET \
    --get "https://app.crescat.io/external/v1/calendar/format" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://app.crescat.io/external/v1/calendar/format"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
 event_types [
   {
     "id": 1,
     "name": "Event Type",
   }
 ],
 fields [
   {
     "id": 1,
     "title": "Title of Your Field",
     "format": String,
   }
 ]

Formats of Fields:
 String
 Rich formatted Text
 Date (2000-01-01)
 Time (12:00:00)
 Document url
 Boolean
}
 

Example response (401, Festival Not Found: either not existing, or not your festival.):



 

Request      

GET external/v1/calendar/format

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Venue/Rooms

GET Venue Rooms List

requires authentication

Get array of all rooms on your venue

Example request:
curl --request GET \
    --get "https://app.crescat.io/external/v1/rooms" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://app.crescat.io/external/v1/rooms"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
 [
   {
     "id": 1,
     "name": "Room Name",
   }
 ]
}
 

Request      

GET external/v1/rooms

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

GET Room Booking List

requires authentication

Get array of all bookings for room

Example request:
curl --request GET \
    --get "https://app.crescat.io/external/v1/rooms/1/calendar?start=qui&end=occaecati" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://app.crescat.io/external/v1/rooms/1/calendar"
);

const params = {
    "start": "qui",
    "end": "occaecati",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
 [
   {
     "id": 1,
     "name": "Event Name",
     "start": 2000-01-01 12:00:00,
     "end": 2000-01-01 15:00:00,
   }
 ]
}
 

Request      

GET external/v1/rooms/{roomId}/calendar

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

roomId   integer   

The id of the room you want to get calendar for. Example: 1

Query Parameters

start   string  optional  

Start of dates to query.
If not provided: today.
Format: 2000-01-01 Example: qui

end   string  optional  

End of dates to query.
If not provided: today.
Format: 2000-01-01 Example: occaecati

Festival

APIs for managing public forms related to a specific festival.

GET Festival List

requires authentication

Array of all festivals for your organization.

Example request:
curl --request GET \
    --get "https://app.crescat.io/external/v1/festivals" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://app.crescat.io/external/v1/festivals"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
Array of all festivals for your organization.
 [
   {
     "id": 1,
     "name": "Name of Your Festival",
     "start": 2000-01-01 12:00:00,
     "end": 2000-01-01 15:00:00,
   }
 ]
}
 

Request      

GET external/v1/festivals

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

GET Festival Performance List

requires authentication

Which fields are set on the token itself
Which Contacts are included is set on the token itself, either

Example request:
curl --request GET \
    --get "https://app.crescat.io/external/v1/festivals/1/performances" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://app.crescat.io/external/v1/festivals/1/performances"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
 [
   {
     "id": 1,
     "name": "Performance Name",
     "type": "Performance Type",
      "fields": [
       {
         "id": 1,
         "value": *,
        }
        for details on formatting: see performance field format
     ],
     "events": [
       {
         "id": 1,
         "name": "Name of Event",
        }
     ],
     "contacts": [
       {
         "id": 1,
         "name": "Name of Contact",
         "first_name": "First Name of Contact",
         "last_name": "Last Name of Contact",
         "email": "Email of Contact",
         "phone": "Phone of Contact",
         "country_code": "Country Code of Contact",
         "primary": "Is the contact primary or not",
         "travel_party": "Is the contact part of travel party or not",
         "role": "Role of Contact",
         "type": "Type of Contact",
        }
     ],
   }
 ]
}
 

Request      

GET external/v1/festivals/{festivalId}/performances

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

festivalId   integer   

The id of the festival you want to get performances for. Example: 1

GET Festival Performance Response Format & Definitions

requires authentication

Get format of all performance fields that will be included when requesting performances

Example request:
curl --request GET \
    --get "https://app.crescat.io/external/v1/festivals/1/performances/format" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://app.crescat.io/external/v1/festivals/1/performances/format"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
 fields [
   {
     "id": 1,
     "title": "Title of Your Field",
     "format": String,
   }
 ]

Formats of Fields:
 String
 Rich formatted Text
 Date (2000-01-01)
 Time (12:00:00)
 Document url
 Boolean
}
 

Example response (401, Festival Not Found: either not existing, or not your festival.):



 

Request      

GET external/v1/festivals/{festivalId}/performances/format

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

festivalId   integer   

The id of the festival you want to get performances for. Example: 1

GET Festival Event List

requires authentication

Example request:
curl --request GET \
    --get "https://app.crescat.io/external/v1/festivals/1/events" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://app.crescat.io/external/v1/festivals/1/events"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
 [
   {
     "id": 1,
     "name": "Event Name",
     "start_date": 2000-01-01,
     "end_date": 2000-01-01,
     "production_period": [
         "start": 2000-01-01 12:00:00,
         "end": 2000-01-01 15:00:00,
     ],
     "fields": [
       {
         "id": 1,
         "show_time_id": 1,
         "value": *,
        }
        for details on formatting: see event field format
     ],
     "show_times": [
       {
         "id": 1,
         "title": "Show Title",
         "start": 2000-01-01 12:00:00,
         "end": 2000-01-01 15:00:00,
         "room_id": 1,
        }
     ],
     "festival_resources": [
       {
         "id": 1,
         "name": "Festival Resource",
        }
     ],
     "rooms": [
       {
         "id": 1,
         "title": "Show Title",
         "start": 2000-01-01 12:00:00,
         "end": 2000-01-01 15:00:00,
        }
     ],
     "performances": [
       {
         "id": 1,
         "name": "Performance Name",
        }
     ],
     "venue": {
         "id": 1,
         "name": "Venue Name",
         "address": "Venue Address",
         "city": "Venue City",
         "postal_code": "Postal Code",
         "country": "Country",
         "website": "Website",
         "phone": "Phone",
        },
   }
 ]
}
 

Request      

GET external/v1/festivals/{festivalId}/events

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

festivalId   integer   

The id of the festival you want to get events for. Example: 1

GET Festival Event Response Format & Definitions

requires authentication

Get format and info from fields that will be included when requesting events

Example request:
curl --request GET \
    --get "https://app.crescat.io/external/v1/festivals/1/events/format" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://app.crescat.io/external/v1/festivals/1/events/format"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
 fields [
   {
     "id": 1,
     "title": "Title of Your Field",
     "format": String,
   }
 ],
 festival_event_types [
   {
     "id": 1,
     "name": "Concert",
   }
 ]

Formats of Fields:
 String
 Rich formatted Text
 Date (2000-01-01)
 Time (12:00:00)
 Document url
 Boolean
}
 

Example response (401, Festival Not Found: either not existing, or not your festival.):



 

Request      

GET external/v1/festivals/{festivalId}/events/format

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

festivalId   integer   

The id of the festival you want to get events for. Example: 1

List Public Forms for Festival

requires authentication

Get an array of all public forms belonging to the specified festival that you own.

Example request:
curl --request GET \
    --get "https://app.crescat.io/external/v1/festivals/1/public-forms" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://app.crescat.io/external/v1/festivals/1/public-forms"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200, Success):


[
    {
        "id": 1,
        "name": "Name of Your Public Form"
    },
    {
        "id": 2,
        "name": "Another Public Form"
    }
]
 

Example response (401, Unauthorized):


[]
 

Request      

GET external/v1/festivals/{festivalId}/public-forms

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

festivalId   integer   

The ID of the festival. Example: 1

Get Public Form Responders

requires authentication

Get an array of all responders (submissions) for a specific public form. You can optionally filter which custom form fields are included in the response.

Example request:
curl --request GET \
    --get "https://app.crescat.io/external/v1/festivals/1/public-forms/1?public_form_field_ids[]=1&public_form_field_ids[]=5&public_form_field_ids[]=10" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://app.crescat.io/external/v1/festivals/1/public-forms/1"
);

const params = {
    "public_form_field_ids[0]": "1",
    "public_form_field_ids[1]": "5",
    "public_form_field_ids[2]": "10",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200, Success):


[
{
"id": 1,
"name": "John Doe",
"first_name": "John",
"last_name": "Doe",
"email": "john.doe@example.com",
"accepted_at": "2024-01-15 10:00:00",
"declined_at": null,
"public_form_fields": [
{
"id": 1,
"value": "Value for custom field 1"
},
{
"id": 5,
"value": true
}
// Other fields included based on public_form_field_ids query param
// For details on value formatting: see 'Get Public Form Format' endpoint
]
}
]
 

Example response (401, Unauthorized):


[]
 

Request      

GET external/v1/festivals/{festivalId}/public-forms/{publicFormId}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

festivalId   integer   

The ID of the festival. Example: 1

publicFormId   integer   

The ID of the public form. Example: 1

Query Parameters

public_form_field_ids   integer[]  optional  

optional An array of PublicFormField IDs. If provided, only these custom fields will be included in the public_form_fields array for each responder. If omitted or empty, no custom fields are included by default via this mechanism (resource might still include some).

Get Public Form Format

requires authentication

Get the definition and format of standard fields and custom fields for a specific public form's responses. Useful for understanding the data structure returned by the "Get Public Form Responders" endpoint.

Example request:
curl --request GET \
    --get "https://app.crescat.io/external/v1/festivals/1/public-forms/1/format" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://app.crescat.io/external/v1/festivals/1/public-forms/1/format"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200, Success):


{
    "id": "Number",
    "name": "String",
    "first_name": "String",
    "last_name": "String | null",
    "phone": "String | null",
    "country_code": "String | null",
    "email": "String",
    "created_at": "String (YYYY-MM-DD HH:MM:SS)",
    "accepted_at": "String (YYYY-MM-DD HH:MM:SS) | null",
    "declined_at": "String (YYYY-MM-DD HH:MM:SS) | null",
    "assigned_work_minutes": "int",
    "expected_work_minutes": "int",
    "completed_work_minutes": "int",
    "public_form_fields": [
        {
            "id": 1,
            "title": "Title of Your Custom Field",
            "format": "String | Rich formatted Text | Date (YYYY-MM-DD) | Time (HH:MM:SS) | Document url | Boolean",
            "section": "Section Title | null"
        }
    ]
}
 

Example response (401, Unauthorized):


[] Comment="Festival Not Found: either not existing, or not your festival, or the public form does not belong to this festival."
 

Request      

GET external/v1/festivals/{festivalId}/public-forms/{publicFormId}/format

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

festivalId   integer   

The ID of the festival. Example: 1

publicFormId   integer   

The ID of the public form. Example: 1