MENU navbar-image

Introduction

Public API for festiware — the SaaS platform for festival and event management.

Welcome to the festiware API documentation.

festiware provides a comprehensive REST API for managing festivals and events, including ticketing, check-in, crew management, scheduling, catering, and more.

## Authentication
The API uses **OAuth 2.0** via Laravel Passport with token redemption. Two grant types are supported:
- **Password Grant** — for user-facing applications (CheckIn App, Time Tracking). Exchange user credentials for an access token via `POST /oauth/token`.
- **Client Credentials Grant** — for machine-to-machine integrations (Crew Portal, Forms, Workflows). Exchange client ID/secret for an access token via `POST /oauth/token`.

Both flows return a Bearer token. Include it in all authenticated requests:
```
Authorization: Bearer {your_access_token}
```

<aside>As you scroll, you'll see code examples for working with the API in different programming languages in the dark area to the right (or as part of the content on mobile).
You can switch the language used with the tabs at the top right (or from the nav menu at the top left on mobile).</aside>

Authenticating requests

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

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

Obtain a token via POST /oauth/token using either Password Grant (user credentials) or Client Credentials Grant. The returned access_token must be sent as a Bearer token in the Authorization header.

Public API

Resources

Display the specified resource.

requires authentication

Example request:
curl --request GET \
    --get "https://{instance}.festiware.eu/api/v1/applications/32/architecto" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/applications/32/architecto"
);

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/applications/32/architecto';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (404):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 292
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "message": "Not Found",
    "errors": {
        "project_id": "Eintrag konnte nicht gefunden werden."
    }
}
 

Request      

GET api/v1/applications/{application_type_id}/{project_id}

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

application_type_id   integer     

The ID of the application type. Example: 32

project_id   string     

The ID of the project. Example: architecto

Display the specified resource.

requires authentication

Required permission: all_persons_and_applications_see

Example request:
curl --request GET \
    --get "https://{instance}.festiware.eu/api/v1/people/002f0ff5-71ab-4e25-be80-c7a9eac9da32/architecto" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/people/002f0ff5-71ab-4e25-be80-c7a9eac9da32/architecto"
);

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/people/002f0ff5-71ab-4e25-be80-c7a9eac9da32/architecto';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (404):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 291
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "message": "Not Found",
    "errors": {
        "project_id": "Eintrag konnte nicht gefunden werden."
    }
}
 

Request      

GET api/v1/people/{person_type_id}/{project_id}

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

person_type_id   string     

The ID of the person type. Example: 002f0ff5-71ab-4e25-be80-c7a9eac9da32

project_id   string     

The ID of the project. Example: architecto

POST api/v1/projects/{project_id}/people

requires authentication

Required permission: all_persons_and_applications_administrate

Example request:
curl --request POST \
    "https://{instance}.festiware.eu/api/v1/projects/1/people" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"id\": \"550e8400-e29b-41d4-a716-446655440000\",
    \"personTypes\": [
        \"architecto\"
    ],
    \"actAsBackendCreation\": false,
    \"data\": {
        \"name\": \"Müller\",
        \"firstname\": \"Anna\",
        \"email\": \"anna@example.com\"
    }
}"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/projects/1/people"
);

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

let body = {
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "personTypes": [
        "architecto"
    ],
    "actAsBackendCreation": false,
    "data": {
        "name": "Müller",
        "firstname": "Anna",
        "email": "anna@example.com"
    }
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/projects/1/people';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'id' => '550e8400-e29b-41d4-a716-446655440000',
            'personTypes' => [
                'architecto',
            ],
            'actAsBackendCreation' => false,
            'data' => [
                'name' => 'Müller',
                'firstname' => 'Anna',
                'email' => 'anna@example.com',
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (422):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 290
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "message": "Validation failed",
    "errors": {
        "personTypes.0": [
            "One or more personTypes are invalid for this project"
        ]
    }
}
 

Request      

POST api/v1/projects/{project_id}/people

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

project_id   integer     

The ID of the project. Example: 1

Body Parameters

id   string  optional    

Optional UUID for the new person. Auto-generated if omitted. value ist keine gültige UUID. Example: 550e8400-e29b-41d4-a716-446655440000

personTypes   string[]  optional    

The shortname of an existing record in the types table.

actAsBackendCreation   boolean  optional    

If true, marks this as an internal (backend/Nova) creation rather than a public form submission. This affects validation (e.g. required fields on public forms are skipped) and workflow triggers — some triggers only fire on frontend submissions, others fire on both frontend and backend creations. Example: false

data   object     

Key-value object with person data. Only scalar values allowed — no nested arrays/objects. Known keys: name, firstname, email, phone, comment, note, address, street. Additional keys are accepted but trigger a warning in the response. value soll mindestens 1 Einträge haben.

GET api/v1/people/{person_id}

requires authentication

Required permission: all_persons_and_applications_see

Example request:
curl --request GET \
    --get "https://{instance}.festiware.eu/api/v1/people/002f0ff5-71ab-4e25-be80-c7a9eac9da32" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/people/002f0ff5-71ab-4e25-be80-c7a9eac9da32"
);

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/people/002f0ff5-71ab-4e25-be80-c7a9eac9da32';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 278
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "id": "002f0ff5-71ab-4e25-be80-c7a9eac9da32",
    "data": {
        "city": "Nürnberg",
        "name": "Casino",
        "email": "isabella.casino@gmx.de",
        "country": "DE",
        "firstname": "Isabella",
        "phone_mobile": "+4917646102627"
    },
    "lexware_contact_id": null,
    "calculated_data": [],
    "checked_in_at": null,
    "deleted_at": null,
    "created_at": "2025-11-27T12:18:00.000000Z",
    "updated_at": "2025-11-27T12:18:00.000000Z",
    "deactivated_at": null,
    "anonymized_at": null,
    "project_id": 0,
    "fullname": "Isabella Casino",
    "person_types": [
        {
            "id": 24,
            "name": "Helfer",
            "description": "Helferinnen und Helfer",
            "shortname": "VolunteerPerson",
            "typeable_model": "App\\PersonType",
            "created_at": "2024-11-11T19:52:48.000000Z",
            "updated_at": "2026-03-23T11:23:40.000000Z",
            "order": 1,
            "project_id": null,
            "data": {
                "portal": {
                    "meals": false,
                    "events": false,
                    "eventsTo": null,
                    "guestList": false,
                    "eventsFrom": null,
                    "updateForm": true,
                    "updateFormTo": null,
                    "eventsSettings": {
                        "areaTypes": [],
                        "timeLimit": false,
                        "eventTypes": [],
                        "onlyOneArea": false,
                        "onlyTeamJobs": false,
                        "eventsNotJobs": false,
                        "fullDaySelect": false,
                        "hideEventName": false,
                        "maximumSelection": null,
                        "minimumSelection": null,
                        "hideAssignedEvents": false
                    },
                    "updateFormFrom": null
                },
                "menu_name": "Helfer:in",
                "permissionKey": "helfer"
            },
            "menu_name": "Helfer:in",
            "permissionKey": "helfer",
            "pivot": {
                "typeable_type": "App\\Person",
                "typeable_id": "002f0ff5-71ab-4e25-be80-c7a9eac9da32",
                "type_id": 24
            }
        }
    ],
    "tickets_owned": [],
    "person_access_types": [],
    "applications_as_owner": [],
    "applications_as_member": [],
    "assignees": [],
    "journey": [],
    "nfc_tags": [],
    "comments": [],
    "guests": [],
    "teams": [],
    "teams_suggested": [],
    "teams_confirmed": [],
    "teams_assigned": [],
    "contracts": [],
    "events": [],
    "jobs": []
}
 

Request      

GET api/v1/people/{person_id}

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

person_id   string     

The ID of the person. Example: 002f0ff5-71ab-4e25-be80-c7a9eac9da32

PUT api/v1/people/{person_id}

requires authentication

Required permission: all_persons_and_applications_manage

Example request:
curl --request PUT \
    "https://{instance}.festiware.eu/api/v1/people/002f0ff5-71ab-4e25-be80-c7a9eac9da32" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"personTypes\": [
        \"architecto\"
    ],
    \"data\": {
        \"email\": \"new@example.com\",
        \"phone\": \"+49 123 456\"
    },
    \"replaceMissing\": false,
    \"updatedAt\": \"2026-04-10T14:30:00+02:00\"
}"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/people/002f0ff5-71ab-4e25-be80-c7a9eac9da32"
);

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

let body = {
    "personTypes": [
        "architecto"
    ],
    "data": {
        "email": "new@example.com",
        "phone": "+49 123 456"
    },
    "replaceMissing": false,
    "updatedAt": "2026-04-10T14:30:00+02:00"
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/people/002f0ff5-71ab-4e25-be80-c7a9eac9da32';
$response = $client->put(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'personTypes' => [
                'architecto',
            ],
            'data' => [
                'email' => 'new@example.com',
                'phone' => '+49 123 456',
            ],
            'replaceMissing' => false,
            'updatedAt' => '2026-04-10T14:30:00+02:00',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (422):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 277
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "message": "Validation failed",
    "errors": {
        "personTypes.0": [
            "One or more personTypes are invalid for this project"
        ]
    }
}
 

Request      

PUT api/v1/people/{person_id}

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

person_id   string     

The ID of the person. Example: 002f0ff5-71ab-4e25-be80-c7a9eac9da32

Body Parameters

personTypes   string[]  optional    

The shortname of an existing record in the types table.

data   object     

Key-value object with person data. Only scalar values allowed. If replaceMissing is false (default), only provided keys are updated — omitted keys stay unchanged. value soll mindestens 1 Einträge haben.

replaceMissing   boolean  optional    

If true, keys not present in data are cleared (set to null). Default: false (partial update). Example: false

updatedAt   string     

ISO 8601 timestamp of the last known version. Used for optimistic concurrency control. Must be a valid date in the format Y-m-d\TH:i:sP. Example: 2026-04-10T14:30:00+02:00

GET api/v1/application-types

requires authentication

Example request:
curl --request GET \
    --get "https://{instance}.festiware.eu/api/v1/application-types" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/application-types"
);

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/application-types';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 276
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

[
    {
        "name": "Künstler/Ensembles",
        "description": "Bands oder Einzelkünstler",
        "shortname": "ArtistApplication",
        "id": 15
    },
    {
        "name": "Händler",
        "description": "Stände für Gastro und Verkauf",
        "shortname": "VendorApplication",
        "id": 16
    },
    {
        "name": "Workshop",
        "description": "Workshopanmeldung",
        "shortname": "WorkshopApplication",
        "id": 17
    },
    {
        "name": "Dienstleister",
        "description": "Technikfirmen, Veranstaltungsorte, usw.",
        "shortname": "ServiceApplication",
        "id": 18
    },
    {
        "name": "Crew",
        "description": "Crews",
        "shortname": "CrewApplication",
        "id": 19
    },
    {
        "name": "Veranstaltungen",
        "description": null,
        "shortname": "VeranstaltungApplication",
        "id": 37
    },
    {
        "name": "Agenturen",
        "description": "Künstleragenturen, welche die Künstler vertreten",
        "shortname": "AgenturApplication",
        "id": 429
    }
]
 

Request      

GET api/v1/application-types

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

GET api/v1/person-types

requires authentication

Example request:
curl --request GET \
    --get "https://{instance}.festiware.eu/api/v1/person-types" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/person-types"
);

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/person-types';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 275
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

[
    {
        "name": "Besucher",
        "description": "Festivalbesucherinnen und -besucher",
        "shortname": "VisitorPerson",
        "id": 20
    },
    {
        "name": "Händler",
        "description": "Standbetreiberinnen und -betreiber",
        "shortname": "VendorPerson",
        "id": 21
    },
    {
        "name": "ION-Mitglieder",
        "description": "ION Stab",
        "shortname": "TeamMemberPerson",
        "id": 22
    },
    {
        "name": "Künstler- /Ansprech -",
        "description": "Künstlerinnen und Künstler",
        "shortname": "ArtistPerson",
        "id": 23
    },
    {
        "name": "Helfer",
        "description": "Helferinnen und Helfer",
        "shortname": "VolunteerPerson",
        "id": 24
    },
    {
        "name": "Dienstleister",
        "description": "Dienstleisterinnen und Dienstleister",
        "shortname": "ServicePerson",
        "id": 25
    },
    {
        "name": "Workshopleiter",
        "description": "Workshopleiter und -leiterinnen",
        "shortname": "TeacherPerson",
        "id": 26
    },
    {
        "name": "Crewmitglied",
        "description": "Crewmitglieder",
        "shortname": "CrewPerson",
        "id": 27
    },
    {
        "name": "Mitarbeiter Künstler/Agentur",
        "description": null,
        "shortname": "APderKnstelragenturPerson",
        "id": 430
    }
]
 

Request      

GET api/v1/person-types

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Responds Projects Available to API

requires authentication

Returns only projects the authenticated user has access to. If the user has no explicit project restrictions, all projects are returned.

Example request:
curl --request GET \
    --get "https://{instance}.festiware.eu/api/v1/projects" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/projects"
);

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/projects';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 274
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

[
    {
        "id": 1,
        "name": "74. Musikfest ION",
        "shortname": "ION-2025",
        "description": "Die erste Veranstaltung mit festiware.",
        "start_date": "2024-12-31T23:00:00.000000Z",
        "end_date": "2025-12-30T23:00:00.000000Z",
        "status": "past",
        "created_at": "2024-11-11T19:52:46.000000Z",
        "updated_at": "2026-01-09T10:27:23.000000Z"
    },
    {
        "id": 35,
        "name": "75. Musikfest ION",
        "shortname": "ION-26",
        "description": null,
        "start_date": "2025-12-31T23:00:00.000000Z",
        "end_date": "2026-12-30T23:00:00.000000Z",
        "status": "current",
        "created_at": "2025-10-18T19:02:45.000000Z",
        "updated_at": "2025-10-20T18:13:39.000000Z"
    },
    {
        "id": 36,
        "name": "76. Musikfest ION",
        "shortname": "ION-27",
        "description": "Musikest ION 2027",
        "start_date": "2026-12-31T23:00:00.000000Z",
        "end_date": "2027-12-30T23:00:00.000000Z",
        "status": "upcoming",
        "created_at": "2026-02-24T14:44:32.000000Z",
        "updated_at": "2026-04-07T21:59:11.000000Z"
    }
]
 

Request      

GET api/v1/projects

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Display a listing of users.

requires authentication

Example request:
curl --request GET \
    --get "https://{instance}.festiware.eu/api/v1/users" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/users"
);

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/users';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (403):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 273
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "message": "This action is unauthorized."
}
 

Request      

GET api/v1/users

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Store a newly created user in storage.

requires authentication

Example request:
curl --request POST \
    "https://{instance}.festiware.eu/api/v1/users" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"jdoe\",
    \"email\": \"jdoe@example.com\",
    \"password\": \"secureP4ss!\"
}"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/users"
);

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

let body = {
    "name": "jdoe",
    "email": "jdoe@example.com",
    "password": "secureP4ss!"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/users';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'jdoe',
            'email' => 'jdoe@example.com',
            'password' => 'secureP4ss!',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (403):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 272
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "message": "This action is unauthorized."
}
 

Request      

POST api/v1/users

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

name   string     

Unique username. value darf nicht länger/größer als 255 Zeichen/Einträge sein. Example: jdoe

email   string     

Unique email address. value muss eine valide E-Mail-Adresse sein. value darf nicht länger/größer als 255 Zeichen/Einträge sein. Example: jdoe@example.com

password   string     

Password (min 8 characters). Must be sent with password_confirmation. value muss mindestens 8 Zeichen haben. Example: secureP4ss!

Display the specified user.

requires authentication

Example request:
curl --request GET \
    --get "https://{instance}.festiware.eu/api/v1/users/architecto" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/users/architecto"
);

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/users/architecto';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (403):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 271
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "message": "This action is unauthorized."
}
 

Request      

GET api/v1/users/{id}

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

The ID of the user. Example: architecto

Update the specified user in storage.

requires authentication

Example request:
curl --request PUT \
    "https://{instance}.festiware.eu/api/v1/users/architecto" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"jdoe\",
    \"email\": \"jdoe@example.com\",
    \"password\": \"secureP4ss!\"
}"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/users/architecto"
);

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

let body = {
    "name": "jdoe",
    "email": "jdoe@example.com",
    "password": "secureP4ss!"
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/users/architecto';
$response = $client->put(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'jdoe',
            'email' => 'jdoe@example.com',
            'password' => 'secureP4ss!',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (403):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 270
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "message": "This action is unauthorized."
}
 

Request      

PUT api/v1/users/{id}

PATCH api/v1/users/{id}

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

The ID of the user. Example: architecto

Body Parameters

name   string  optional    

Unique username. value darf nicht länger/größer als 255 Zeichen/Einträge sein. Example: jdoe

email   string  optional    

Unique email address. value muss eine valide E-Mail-Adresse sein. value darf nicht länger/größer als 255 Zeichen/Einträge sein. Example: jdoe@example.com

password   string  optional    

Password (min 8 characters). Must be sent with password_confirmation. value muss mindestens 8 Zeichen haben. Example: secureP4ss!

Remove the specified user from storage.

requires authentication

Example request:
curl --request DELETE \
    "https://{instance}.festiware.eu/api/v1/users/architecto" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/users/architecto"
);

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


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/users/architecto';
$response = $client->delete(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (403):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 269
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "message": "This action is unauthorized."
}
 

Request      

DELETE api/v1/users/{id}

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

The ID of the user. Example: architecto

POST api/v1/guests/{signupLinkCode}

requires authentication

Example request:
curl --request POST \
    "https://{instance}.festiware.eu/api/v1/guests/architecto" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/guests/architecto"
);

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


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/guests/architecto';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (403):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 233
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "exception": "Signup Link is not valid",
    "message": "Signup Link is not valid."
}
 

Request      

POST api/v1/guests/{signupLinkCode}

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

signupLinkCode   string     

Example: architecto

POST api/v1/guest

requires authentication

Example request:
curl --request POST \
    "https://{instance}.festiware.eu/api/v1/guest" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/guest"
);

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


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/guest';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (500):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 232
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "message": "Server Error"
}
 

Request      

POST api/v1/guest

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

POST api/v1/events/{signupLinkCode}

requires authentication

Example request:
curl --request POST \
    "https://{instance}.festiware.eu/api/v1/events/architecto" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/events/architecto"
);

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


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/events/architecto';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (403):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 231
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "exception": "Signup Link is not valid",
    "message": "Signup Link is not valid."
}
 

Request      

POST api/v1/events/{signupLinkCode}

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

signupLinkCode   string     

Example: architecto

POST api/v1/events

requires authentication

Example request:
curl --request POST \
    "https://{instance}.festiware.eu/api/v1/events" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/events"
);

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


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/events';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (500):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 230
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "message": "Server Error"
}
 

Request      

POST api/v1/events

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

events   string  optional    

POST api/v1/remove-guest

requires authentication

Example request:
curl --request POST \
    "https://{instance}.festiware.eu/api/v1/remove-guest" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/remove-guest"
);

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


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/remove-guest';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (500):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 229
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "message": "Server Error"
}
 

Request      

POST api/v1/remove-guest

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

CheckIn

Display a paginated listing of the ticket codes.

requires authentication

Example request:
curl --request GET \
    --get "https://{instance}.festiware.eu/api/v1/ticket-codes/architecto" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/ticket-codes/architecto"
);

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/ticket-codes/architecto';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (404):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 293
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "message": "Not Found",
    "errors": {
        "project_id": "Eintrag konnte nicht gefunden werden."
    }
}
 

Request      

GET api/v1/ticket-codes/{project_id}

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

project_id   string     

The ID of the project. Example: architecto

POST api/v1/ticket_code/redeem

requires authentication

Required permission: check_in

Example request:
curl --request POST \
    "https://{instance}.festiware.eu/api/v1/ticket_code/redeem" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/ticket_code/redeem"
);

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


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/ticket_code/redeem';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (500):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 268
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "message": "Server Error"
}
 

Request      

POST api/v1/ticket_code/redeem

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

POST api/v1/ticket_code/verify

requires authentication

Required permission: check_in

Example request:
curl --request POST \
    "https://{instance}.festiware.eu/api/v1/ticket_code/verify" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/ticket_code/verify"
);

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


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/ticket_code/verify';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (500):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 267
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "message": "Server Error"
}
 

Request      

POST api/v1/ticket_code/verify

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

POST api/v1/ticket_code/tag

requires authentication

Required permission: check_in

Example request:
curl --request POST \
    "https://{instance}.festiware.eu/api/v1/ticket_code/tag" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/ticket_code/tag"
);

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


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/ticket_code/tag';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (500):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 266
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "message": "Server Error"
}
 

Request      

POST api/v1/ticket_code/tag

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

POST api/v1/ticket_code/tag/revoke

requires authentication

Required permission: check_in

Example request:
curl --request POST \
    "https://{instance}.festiware.eu/api/v1/ticket_code/tag/revoke" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/ticket_code/tag/revoke"
);

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


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/ticket_code/tag/revoke';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (500):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 265
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "message": "Server Error"
}
 

Request      

POST api/v1/ticket_code/tag/revoke

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

POST api/v1/hardtickets/activate

requires authentication

Required permission: ticket_activate

Example request:
curl --request POST \
    "https://{instance}.festiware.eu/api/v1/hardtickets/activate" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"ticket_code\": \"WKD-A1B2C3D4\",
    \"firstname\": \"Anna\",
    \"lastname\": \"Schmidt\",
    \"email\": \"anna@example.com\",
    \"address\": \"Hauptstr. 12\",
    \"zip\": \"04109\",
    \"city\": \"Leipzig\"
}"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/hardtickets/activate"
);

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

let body = {
    "ticket_code": "WKD-A1B2C3D4",
    "firstname": "Anna",
    "lastname": "Schmidt",
    "email": "anna@example.com",
    "address": "Hauptstr. 12",
    "zip": "04109",
    "city": "Leipzig"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/hardtickets/activate';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'ticket_code' => 'WKD-A1B2C3D4',
            'firstname' => 'Anna',
            'lastname' => 'Schmidt',
            'email' => 'anna@example.com',
            'address' => 'Hauptstr. 12',
            'zip' => '04109',
            'city' => 'Leipzig',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (422):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 246
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "ticket_code": [
        "Die Auswahl zu ticket code ist ungültig."
    ]
}
 

Request      

POST api/v1/hardtickets/activate

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

ticket_code   string     

The ticket code to activate. Must exist in the system. The code of an existing record in the ticket_codes table. Example: WKD-A1B2C3D4

firstname   string     

First name of the ticket holder. Example: Anna

lastname   string     

Last name of the ticket holder. Example: Schmidt

email   string     

Email address of the ticket holder. value muss eine valide E-Mail-Adresse sein. Example: anna@example.com

address   string  optional    

Street address (optional). Example: Hauptstr. 12

zip   string  optional    

Postal code (optional). Example: 04109

city   string  optional    

City (optional). Example: Leipzig

POST api/v1/hardtickets/check

requires authentication

Required permission: ticket_activate

Example request:
curl --request POST \
    "https://{instance}.festiware.eu/api/v1/hardtickets/check" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/hardtickets/check"
);

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


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/hardtickets/check';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (500):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 245
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "message": "Server Error"
}
 

Request      

POST api/v1/hardtickets/check

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Catering

GET api/v1/meals/{project_id}

requires authentication

Example request:
curl --request GET \
    --get "https://{instance}.festiware.eu/api/v1/meals/architecto" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/meals/architecto"
);

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/meals/architecto';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (404):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 289
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "message": "Not Found",
    "errors": {
        "project_id": "Eintrag konnte nicht gefunden werden."
    }
}
 

Request      

GET api/v1/meals/{project_id}

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

project_id   string     

The ID of the project. Example: architecto

GET api/v1/meals/{project_id}/{meal_id}

requires authentication

Example request:
curl --request GET \
    --get "https://{instance}.festiware.eu/api/v1/meals/architecto/architecto" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/meals/architecto/architecto"
);

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/meals/architecto/architecto';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (404):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 288
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "message": "Not Found",
    "errors": {
        "project_id": "Eintrag konnte nicht gefunden werden."
    }
}
 

Request      

GET api/v1/meals/{project_id}/{meal_id}

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

project_id   string     

The ID of the project. Example: architecto

meal_id   string     

The ID of the meal. Example: architecto

Returns meals that are available for **serving** to a certain user right now Called by CheckIn APP

requires authentication

Required permission: app\modules\catering\policies\mealorder_manage

Example request:
curl --request POST \
    "https://{instance}.festiware.eu/api/v1/meals/available" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/meals/available"
);

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


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/meals/available';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (400):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 260
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "message": "nfc_tag parameter is not provided. Please provide nfc_tag"
}
 

Request      

POST api/v1/meals/available

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

POST api/v1/meals/redeem

requires authentication deprecated:- should use meals_redeem in future for ability to redeem several meals of one type

Required permission: app\modules\catering\policies\mealorder_manage

Example request:
curl --request POST \
    "https://{instance}.festiware.eu/api/v1/meals/redeem" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/meals/redeem"
);

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


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/meals/redeem';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (500):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 259
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "message": "Server Error"
}
 

Request      

POST api/v1/meals/redeem

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

POST api/v1/meals/redeem-multi

requires authentication

Required permission: app\modules\catering\policies\mealorder_manage

Example request:
curl --request POST \
    "https://{instance}.festiware.eu/api/v1/meals/redeem-multi" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"meal_order_id\": 123,
    \"amount\": 1
}"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/meals/redeem-multi"
);

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

let body = {
    "meal_order_id": 123,
    "amount": 1
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/meals/redeem-multi';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'meal_order_id' => 123,
            'amount' => 1.0,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (500):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 258
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "message": "Server Error"
}
 

Request      

POST api/v1/meals/redeem-multi

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

meal_order_id   string     

ID of the meal order to redeem. Must exist and the associated meal must be within its serving window. The id of an existing record in the cg_meal_orders table. Example: 123

amount   number     

Number of portions to redeem. Must not exceed remaining open portions. If all portions are consumed and seconds are allowed, only 1 is permitted. value muss mindestens 1 sein. Example: 1

POST api/v1/meals/redeem-adhoc

requires authentication

Required permission: app\modules\catering\policies\mealorder_manage

Example request:
curl --request POST \
    "https://{instance}.festiware.eu/api/v1/meals/redeem-adhoc" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"personTag\": \"04A3B2C1D2E3F4\",
    \"meal_id\": 7,
    \"amount\": 1
}"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/meals/redeem-adhoc"
);

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

let body = {
    "personTag": "04A3B2C1D2E3F4",
    "meal_id": 7,
    "amount": 1
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/meals/redeem-adhoc';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'personTag' => '04A3B2C1D2E3F4',
            'meal_id' => 7,
            'amount' => 1.0,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (422):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 257
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "message": "Die Auswahl zu person tag ist ungültig. (and 1 more error)",
    "errors": {
        "personTag": [
            "Die Auswahl zu person tag ist ungültig."
        ],
        "meal_id": [
            "Die Auswahl zu meal id ist ungültig."
        ]
    }
}
 

Request      

POST api/v1/meals/redeem-adhoc

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

personTag   string     

NFC or QR tag ID identifying the person receiving the meal. The tag_id of an existing record in the nfc_tags table. Example: 04A3B2C1D2E3F4

meal_id   string     

ID of the meal. Must have allow_adhoc_orders enabled. Available meals can be fetched via GET /api/v1/meals/{project_id}. Example: 7

amount   number     

Number of portions to issue. value muss mindestens 1 sein. Example: 1

Fürs Mitwirkendenportal

requires authentication

Example request:
curl --request POST \
    "https://{instance}.festiware.eu/api/v1/meals/architecto" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/meals/architecto"
);

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


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/meals/architecto';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (403):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 236
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "exception": "Signup Link is not valid",
    "message": "Signup Link is not valid."
}
 

Request      

POST api/v1/meals/{signupLinkCode}

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

signupLinkCode   string     

Example: architecto

POST api/v1/meals

requires authentication

Example request:
curl --request POST \
    "https://{instance}.festiware.eu/api/v1/meals" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/meals"
);

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


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/meals';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (500):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 235
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "message": "Server Error"
}
 

Request      

POST api/v1/meals

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Vouchers

Checks the amount of vouchers available

requires authentication

input: { "person_id":{{person_id}}, "nfc_tag":{{nfc_tag}} }

Required permission: app\modules\vouchers\policies\voucher_manage

Example request:
curl --request POST \
    "https://{instance}.festiware.eu/api/v1/voucher/check" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/voucher/check"
);

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


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/voucher/check';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (400):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 256
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "message": "nfc_tag parameter is not provided. Please provide nfc_tag"
}
 

Request      

POST api/v1/voucher/check

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Checks the amount of vouchers available on a certain voucher type

requires authentication

Required permission: app\modules\vouchers\policies\voucher_manage

Example request:
curl --request POST \
    "https://{instance}.festiware.eu/api/v1/voucher/check_type" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/voucher/check_type"
);

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


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/voucher/check_type';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (400):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 255
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "message": "nfc_tag parameter is not provided. Please provide nfc_tag",
    "success": false
}
 

Request      

POST api/v1/voucher/check_type

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Redeems a voucher

requires authentication

{ "voucher_type" : {{Voucher Type}}, "person_id" : {{person_id}}, "beneficiary_id" : {{beneficiary_id}} }

Required permission: app\modules\vouchers\policies\voucher_manage

Example request:
curl --request POST \
    "https://{instance}.festiware.eu/api/v1/voucher/redeem" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/voucher/redeem"
);

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


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/voucher/redeem';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (400):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 254
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "message": "person_id is not provided, neither is nfc_tag. Provide one of that"
}
 

Request      

POST api/v1/voucher/redeem

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Unredeems a voucher

requires authentication

{ "voucher_id" : {{voucher_id}}, "beneficiary_id" : {{beneficiary_id}} }

Required permission: app\modules\vouchers\policies\voucher_manage

Example request:
curl --request POST \
    "https://{instance}.festiware.eu/api/v1/voucher/unredeem" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/voucher/unredeem"
);

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


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/voucher/unredeem';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (500):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 253
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "message": "not implemented, yet"
}
 

Request      

POST api/v1/voucher/unredeem

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

POST api/v1/voucher/stats

requires authentication

Required permission: app\modules\vouchers\policies\voucher_manage

Example request:
curl --request POST \
    "https://{instance}.festiware.eu/api/v1/voucher/stats" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/voucher/stats"
);

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


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/voucher/stats';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (500):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 252
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "message": "beneficiary_id is not provided, neither is beneficiary_tag. Please provide one of that."
}
 

Request      

POST api/v1/voucher/stats

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Crew Portal & Forms

List form definitions.

requires authentication

Returns a paginated list of form definitions. Use the project_id query parameter to filter by project.

Required permission: all_persons_and_applications_see

Example request:
curl --request GET \
    --get "https://{instance}.festiware.eu/api/v1/form-definitions?project_id=1&per_page=25" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/form-definitions"
);

const params = {
    "project_id": "1",
    "per_page": "25",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/form-definitions';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'project_id' => '1',
            'per_page' => '25',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200, success):


[
    {
        "id": 1,
        "name": "Volunteer Registration",
        "project_id": 3,
        "to_type": "VOLUNTEER",
        "model": "App\\Person",
        "published": true,
        "published_from": null,
        "published_to": null,
        "url_shortname": "volunteer-reg",
        "created_at": "2025-01-15T10:00:00.000000Z",
        "updated_at": "2025-06-01T12:00:00.000000Z"
    }
]
 

Request      

GET api/v1/form-definitions

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Query Parameters

project_id   integer  optional    

Filter by project ID. Example: 1

per_page   integer  optional    

Items per page (max 100). Example: 25

Show a single form definition.

requires authentication

Returns the full form definition including data, functions, and publication settings.

Required permission: all_persons_and_applications_see

Example request:
curl --request GET \
    --get "https://{instance}.festiware.eu/api/v1/form-definitions/1" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/form-definitions/1"
);

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/form-definitions/1';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200, success):


{
    "id": 1,
    "name": "Volunteer Registration",
    "description": "Registration form for volunteers",
    "project_id": 3,
    "to_type": "VOLUNTEER",
    "model": "App\\Person",
    "data": {},
    "functions": [],
    "published": true,
    "published_from": null,
    "published_to": null,
    "unpublished_content": null,
    "html_intro": null,
    "success_response": null,
    "url_shortname": "volunteer-reg",
    "tab_label": null,
    "created_at": "2025-01-15T10:00:00.000000Z",
    "updated_at": "2025-06-01T12:00:00.000000Z"
}
 

Example response (404, not found):


{
    "message": "Form definition not found"
}
 

Request      

GET api/v1/form-definitions/{id}

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   integer     

The form definition ID. Example: 1

Update a form definition.

requires authentication

Partial update — only the fields you send will be changed. Fields not included in the request body remain untouched.

Updatable fields: name, description, html_intro, success_response, url_shortname, tab_label, published, published_from, published_to, unpublished_content, data, functions.

Fields that are never updatable via this endpoint: id, project_id, model, to_type, shortname, related_form_id.

Required permission: all_persons_and_applications_administrate

Example request:
curl --request PUT \
    "https://{instance}.festiware.eu/api/v1/form-definitions/1" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"Volunteer Registration 2026\",
    \"description\": \"Updated registration form\",
    \"html_intro\": {
        \"de\": \"<p>Willkommen<\\/p>\",
        \"en\": \"<p>Welcome<\\/p>\"
    },
    \"success_response\": {
        \"de\": \"Danke!\",
        \"en\": \"Thank you!\"
    },
    \"url_shortname\": \"volunteer-reg-2026\",
    \"tab_label\": {
        \"de\": \"Formular\",
        \"en\": \"Form\"
    },
    \"published\": true,
    \"published_from\": \"2026-04-01T00:00:00Z\",
    \"published_to\": \"2026-09-01T00:00:00Z\",
    \"unpublished_content\": \"This form is currently closed.\",
    \"data\": [],
    \"functions\": [
        []
    ]
}"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/form-definitions/1"
);

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

let body = {
    "name": "Volunteer Registration 2026",
    "description": "Updated registration form",
    "html_intro": {
        "de": "<p>Willkommen<\/p>",
        "en": "<p>Welcome<\/p>"
    },
    "success_response": {
        "de": "Danke!",
        "en": "Thank you!"
    },
    "url_shortname": "volunteer-reg-2026",
    "tab_label": {
        "de": "Formular",
        "en": "Form"
    },
    "published": true,
    "published_from": "2026-04-01T00:00:00Z",
    "published_to": "2026-09-01T00:00:00Z",
    "unpublished_content": "This form is currently closed.",
    "data": [],
    "functions": [
        []
    ]
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/form-definitions/1';
$response = $client->put(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'Volunteer Registration 2026',
            'description' => 'Updated registration form',
            'html_intro' => [
                'de' => '<p>Willkommen</p>',
                'en' => '<p>Welcome</p>',
            ],
            'success_response' => [
                'de' => 'Danke!',
                'en' => 'Thank you!',
            ],
            'url_shortname' => 'volunteer-reg-2026',
            'tab_label' => [
                'de' => 'Formular',
                'en' => 'Form',
            ],
            'published' => true,
            'published_from' => '2026-04-01T00:00:00Z',
            'published_to' => '2026-09-01T00:00:00Z',
            'unpublished_content' => 'This form is currently closed.',
            'data' => [],
            'functions' => [
                [],
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200, success):


{
    "message": "Form definition updated",
    "formDefinition": {
        "id": 1,
        "name": "Volunteer Registration 2026",
        "published": true
    }
}
 

Example response (400, disallowed fields):


{
    "message": "Validation failed",
    "errors": {
        "disallowedFields": "The following fields are not allowed: project_id, to_type"
    }
}
 

Example response (404, not found):


{
    "message": "Form definition not found"
}
 

Request      

PUT api/v1/form-definitions/{id}

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   integer     

The form definition ID. Example: 1

Body Parameters

name   string  optional    

The form name. Example: Volunteer Registration 2026

description   string  optional    

The form description. Example: Updated registration form

html_intro   object  optional    

Multilang HTML intro.

success_response   object  optional    

Multilang success message.

url_shortname   string  optional    

URL shortname (max 64 chars). Example: volunteer-reg-2026

tab_label   object  optional    

Tab labels for related forms.

published   boolean  optional    

Publication status. Example: true

published_from   string  optional    

Publish from date (ISO 8601). Example: 2026-04-01T00:00:00Z

published_to   string  optional    

Publish until date (ISO 8601). Example: 2026-09-01T00:00:00Z

unpublished_content   string  optional    

Message shown when form is unpublished. Example: This form is currently closed.

data   object  optional    

Form field definitions and settings.

functions   object[]  optional    

Form functions/behaviors.

GET api/v1/form/{formDefId}

requires authentication

Example request:
curl --request GET \
    --get "https://{instance}.festiware.eu/api/v1/form/architecto" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/form/architecto"
);

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/form/architecto';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (404):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 244
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "message": "errors.notExist"
}
 

Request      

GET api/v1/form/{formDefId}

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

formDefId   string     

Example: architecto

GET api/v1/form/{formDefId}/{signupToken}

requires authentication

Example request:
curl --request GET \
    --get "https://{instance}.festiware.eu/api/v1/form/architecto/architecto" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/form/architecto/architecto"
);

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/form/architecto/architecto';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (403):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 243
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "message": "errors.link_not_valid"
}
 

Request      

GET api/v1/form/{formDefId}/{signupToken}

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

formDefId   string     

Example: architecto

signupToken   string     

Example: architecto

POST api/v1/form

requires authentication

Example request:
curl --request POST \
    "https://{instance}.festiware.eu/api/v1/form" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/form"
);

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


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/form';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (400):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 242
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "exception": "400 bad request",
    "message": "Bitte spezifizieren: form_def_id."
}
 

Request      

POST api/v1/form

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Store a newly created resource in storage.

requires authentication

Example request:
curl --request POST \
    "https://{instance}.festiware.eu/api/v1/forms" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/forms"
);

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


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/forms';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (400):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 241
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "exception": "400 bad request",
    "message": "Bitte spezifizieren: form_def_id."
}
 

Request      

POST api/v1/forms

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

POST api/v1/form/{formDefId}

requires authentication

Example request:
curl --request POST \
    "https://{instance}.festiware.eu/api/v1/form/architecto" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/form/architecto"
);

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


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/form/architecto';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (404):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 240
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "message": "errors.notExist"
}
 

Request      

POST api/v1/form/{formDefId}

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

formDefId   string     

Example: architecto

Display the specified resource.

requires authentication

Example request:
curl --request GET \
    --get "https://{instance}.festiware.eu/api/v1/forms/architecto" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/forms/architecto"
);

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/forms/architecto';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (404):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 239
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "message": "errors.notExist"
}
 

Request      

GET api/v1/forms/{formDefId}

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

formDefId   string     

Example: architecto

Displays a form to be updated.

requires authentication

Example request:
curl --request POST \
    "https://{instance}.festiware.eu/api/v1/forms/update/architecto/architecto" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/forms/update/architecto/architecto"
);

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


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/forms/update/architecto/architecto';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (403):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 238
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "message": "errors.link_not_valid"
}
 

Request      

POST api/v1/forms/update/{formDefId}/{signupLinkCode}

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

formDefId   string     

Example: architecto

signupLinkCode   string     

Example: architecto

POST api/v1/forms/show-available/{signupLinkCode}

requires authentication

Example request:
curl --request POST \
    "https://{instance}.festiware.eu/api/v1/forms/show-available/architecto" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/forms/show-available/architecto"
);

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


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/forms/show-available/architecto';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (403):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 237
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "message": "errors.link_not_valid"
}
 

Request      

POST api/v1/forms/show-available/{signupLinkCode}

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

signupLinkCode   string     

Example: architecto

POST api/v1/resend-email

requires authentication

Example request:
curl --request POST \
    "https://{instance}.festiware.eu/api/v1/resend-email" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/resend-email"
);

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


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/resend-email';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 234
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

[]
 

Request      

POST api/v1/resend-email

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

POST api/v1/files/upload

requires authentication

Example request:
curl --request POST \
    "https://{instance}.festiware.eu/api/v1/files/upload" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/files/upload"
);

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


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/files/upload';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (400):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 228
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "message": "Upload needs to be a file!"
}
 

Request      

POST api/v1/files/upload

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

POST api/v1/files/delete

requires authentication

Example request:
curl --request POST \
    "https://{instance}.festiware.eu/api/v1/files/delete" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"id\": \"architecto\"
}"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/files/delete"
);

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

let body = {
    "id": "architecto"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/files/delete';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'id' => 'architecto',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (404):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 227
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "message": "No query results for model [App\\File] architecto"
}
 

Request      

POST api/v1/files/delete

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

id   string     

Example: architecto

GET api/v1/gdpr-info

requires authentication

Example request:
curl --request GET \
    --get "https://{instance}.festiware.eu/api/v1/gdpr-info" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/gdpr-info"
);

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/gdpr-info';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 226
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "company": {
        "name": "Stiftung ION",
        "person_name": "Moritz Puschke",
        "address_1": "Winklerstr. 13",
        "zip": "90403",
        "place": "Nürnberg",
        "contact_phone": "0911-2144466",
        "contact_email": "info@musikfest-ion.de"
    }
}
 

Request      

GET api/v1/gdpr-info

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

GET api/v1/terms-info

requires authentication

Example request:
curl --request GET \
    --get "https://{instance}.festiware.eu/api/v1/terms-info" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/terms-info"
);

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/terms-info';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 225
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "company": {
        "name": "Stiftung ION",
        "person_name": "Moritz Puschke",
        "address_1": "Winklerstr. 13",
        "zip": "90403",
        "place": "Nürnberg",
        "contact_phone": "0911-2144466",
        "contact_email": "info@musikfest-ion.de",
        "business_reg_place": null,
        "business_legal_venue": null,
        "terms_individual": null,
        "vat_reg_no": "DE133550742",
        "business_id": null
    }
}
 

Request      

GET api/v1/terms-info

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

POST api/v1/forms/request_token/{signupLinkCode}

requires authentication

Example request:
curl --request POST \
    "https://{instance}.festiware.eu/api/v1/forms/request_token/architecto" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/forms/request_token/architecto"
);

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


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/forms/request_token/architecto';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (403):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 224
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "message": "Invalid Signup Link"
}
 

Request      

POST api/v1/forms/request_token/{signupLinkCode}

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

signupLinkCode   string     

Example: architecto

Scheduler

GET api/v1/areas/{project_id}

requires authentication

Example request:
curl --request GET \
    --get "https://{instance}.festiware.eu/api/v1/areas/architecto" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/areas/architecto"
);

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/areas/architecto';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (404):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 298
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "message": "Not Found",
    "errors": {
        "project_id": "Eintrag konnte nicht gefunden werden."
    }
}
 

Request      

GET api/v1/areas/{project_id}

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

project_id   string     

The ID of the project. Example: architecto

GET api/v1/area/{area_id}/events

requires authentication

Example request:
curl --request GET \
    --get "https://{instance}.festiware.eu/api/v1/area/architecto/events" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/area/architecto/events"
);

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/area/architecto/events';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (500):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 297
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "message": "Server Error"
}
 

Request      

GET api/v1/area/{area_id}/events

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

area_id   string     

The ID of the area. Example: architecto

GET api/v1/event_plans/{project_id}

requires authentication

Example request:
curl --request GET \
    --get "https://{instance}.festiware.eu/api/v1/event_plans/architecto" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/event_plans/architecto"
);

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/event_plans/architecto';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (404):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 296
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "message": "Not Found",
    "errors": {
        "project_id": "Eintrag konnte nicht gefunden werden."
    }
}
 

Request      

GET api/v1/event_plans/{project_id}

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

project_id   string     

The ID of the project. Example: architecto

GET api/v1/event_plan/{plan_id}

requires authentication

Example request:
curl --request GET \
    --get "https://{instance}.festiware.eu/api/v1/event_plan/architecto" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/event_plan/architecto"
);

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/event_plan/architecto';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (500):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 295
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "message": "Server Error"
}
 

Request      

GET api/v1/event_plan/{plan_id}

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

plan_id   string     

The ID of the plan. Example: architecto

GET api/v1/event_types/{project_id}

requires authentication

Example request:
curl --request GET \
    --get "https://{instance}.festiware.eu/api/v1/event_types/architecto" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/event_types/architecto"
);

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/event_types/architecto';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (404):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 294
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "message": "Not Found",
    "errors": {
        "project_id": "Eintrag konnte nicht gefunden werden."
    }
}
 

Request      

GET api/v1/event_types/{project_id}

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

project_id   string     

The ID of the project. Example: architecto

Supply Tracking

GET api/v1/supplies/{project_id}

requires authentication

Required permission: app\modules\supply\policies\supplytracking_manage

Example request:
curl --request GET \
    --get "https://{instance}.festiware.eu/api/v1/supplies/architecto" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/supplies/architecto"
);

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/supplies/architecto';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (500):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 264
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "message": "Server Error"
}
 

Request      

GET api/v1/supplies/{project_id}

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

project_id   string     

The ID of the project. Example: architecto

GET api/v1/supply/{supply_id}/items

requires authentication

Required permission: app\modules\supply\policies\supplytracking_manage

Example request:
curl --request GET \
    --get "https://{instance}.festiware.eu/api/v1/supply/architecto/items" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/supply/architecto/items"
);

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/supply/architecto/items';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (404):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 263
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "message": "No query results for model [App\\Modules\\Supply\\Models\\Supply] architecto"
}
 

Request      

GET api/v1/supply/{supply_id}/items

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

supply_id   string     

The ID of the supply. Example: architecto

POST api/v1/supply/item/tracking

requires authentication

Required permission: app\modules\supply\policies\supplytracking_manage

Example request:
curl --request POST \
    "https://{instance}.festiware.eu/api/v1/supply/item/tracking" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"supply_order_id\": 42,
    \"person_id\": \"550e8400-e29b-41d4-a716-446655440000\",
    \"person_tag_number\": \"04A3B2C1D2E3F4\",
    \"supply_item_tag_number\": \"SUP001\",
    \"supply_item_tag_numbers\": [
        \"architecto\"
    ],
    \"supply_item_id\": 17,
    \"event_type\": \"issued\",
    \"area_id\": 3,
    \"stock_location\": \"Warehouse A, Shelf 3\",
    \"geolocation\": \"51.3397,12.3731\",
    \"w3w\": \"filled.count.soap\",
    \"annotations\": \"Slight damage on left handle\",
    \"image_url\": \"https:\\/\\/storage.example.com\\/tracking\\/img001.jpg\",
    \"tracked_at\": \"2026-07-15T10:30:00+02:00\"
}"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/supply/item/tracking"
);

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

let body = {
    "supply_order_id": 42,
    "person_id": "550e8400-e29b-41d4-a716-446655440000",
    "person_tag_number": "04A3B2C1D2E3F4",
    "supply_item_tag_number": "SUP001",
    "supply_item_tag_numbers": [
        "architecto"
    ],
    "supply_item_id": 17,
    "event_type": "issued",
    "area_id": 3,
    "stock_location": "Warehouse A, Shelf 3",
    "geolocation": "51.3397,12.3731",
    "w3w": "filled.count.soap",
    "annotations": "Slight damage on left handle",
    "image_url": "https:\/\/storage.example.com\/tracking\/img001.jpg",
    "tracked_at": "2026-07-15T10:30:00+02:00"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/supply/item/tracking';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'supply_order_id' => 42,
            'person_id' => '550e8400-e29b-41d4-a716-446655440000',
            'person_tag_number' => '04A3B2C1D2E3F4',
            'supply_item_tag_number' => 'SUP001',
            'supply_item_tag_numbers' => [
                'architecto',
            ],
            'supply_item_id' => 17,
            'event_type' => 'issued',
            'area_id' => 3,
            'stock_location' => 'Warehouse A, Shelf 3',
            'geolocation' => '51.3397,12.3731',
            'w3w' => 'filled.count.soap',
            'annotations' => 'Slight damage on left handle',
            'image_url' => 'https://storage.example.com/tracking/img001.jpg',
            'tracked_at' => '2026-07-15T10:30:00+02:00',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (422):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 262
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "person_id": [
        "Die Auswahl zu person id ist ungültig."
    ],
    "person_tag_number": [
        "Die Auswahl zu person tag number ist ungültig."
    ],
    "supply_item_tag_number": [
        "Die Auswahl zu supply item tag number ist ungültig."
    ],
    "supply_item_id": [
        "Die Auswahl zu supply item id ist ungültig."
    ],
    "area_id": [
        "Die Auswahl zu area id ist ungültig."
    ],
    "supply_item_tag_numbers.0": [
        "Die Auswahl zu supply_item_tag_numbers.0 ist ungültig."
    ]
}
 

Request      

POST api/v1/supply/item/tracking

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

supply_order_id   integer  optional    

Optional supply order ID for context. Example: 42

person_id   string  optional    

UUID of the person. Required if person_tag_number is not provided. This field is required when person_tag_number is not present. The id of an existing record in the people table. Example: 550e8400-e29b-41d4-a716-446655440000

person_tag_number   string  optional    

NFC or QR tag ID identifying the person. Colons are stripped automatically. Required if person_id is not provided. This field is required when person_id is not present. The tag_id of an existing record in the nfc_tags table. Example: 04A3B2C1D2E3F4

supply_item_tag_number   string  optional    

QR or NFC tag identifier of a single supply item. Colons are stripped automatically. Required if neither supply_item_id nor supply_item_tag_numbers is provided. This field is required when none of supply_item_id and supply_item_tag_numbers are present. The tag_number of an existing record in the s_supply_items table. Example: SUP001

supply_item_tag_numbers   string[]  optional    

The tag_number of an existing record in the s_supply_items table.

supply_item_id   integer  optional    

ID of the supply item. Required if no tag number(s) provided. This field is required when none of supply_item_tag_number and supply_item_tag_numbers are present. The id of an existing record in the s_supply_items table. Example: 17

event_type   string     

Tracking event type. One of: issued, received, stocked, destocked, maintenance, disposed, lost, found, transferred. Example: issued

Must be one of:
  • issued
  • received
  • stocked
  • destocked
  • maintenance
  • disposed
  • lost
  • found
  • transferred
area_id   integer  optional    

Optional area ID where the event occurred. Available areas can be fetched via GET /api/v1/areas/{project_id}. The id of an existing record in the areas table. Example: 3

stock_location   string  optional    

Free-text stock location identifier. Example: Warehouse A, Shelf 3

geolocation   string  optional    

GPS coordinates of the event. Example: 51.3397,12.3731

w3w   string  optional    

what3words address. Example: filled.count.soap

annotations   string  optional    

Free-text notes about the tracking event. Example: Slight damage on left handle

image_url   string  optional    

URL to a photo documenting the event. Example: https://storage.example.com/tracking/img001.jpg

tracked_at   string  optional    

Timestamp of when the event actually happened. Defaults to now if omitted. value ist kein gültiges Datum. Example: 2026-07-15T10:30:00+02:00

GET api/v1/supply/item/{supply_item_id}/tracking

requires authentication

Required permission: app\modules\supply\policies\supplytracking_manage

Example request:
curl --request GET \
    --get "https://{instance}.festiware.eu/api/v1/supply/item/architecto/tracking" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/supply/item/architecto/tracking"
);

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/supply/item/architecto/tracking';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (500):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 261
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "message": "Server Error"
}
 

Request      

GET api/v1/supply/item/{supply_item_id}/tracking

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

supply_item_id   string     

The ID of the supply item. Example: architecto

Ticket Types

List ticket types for a project.

requires authentication

Example request:
curl --request GET \
    --get "https://{instance}.festiware.eu/api/v1/ticket-types/architecto?project_id=5" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/ticket-types/architecto"
);

const params = {
    "project_id": "5",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/ticket-types/architecto';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'project_id' => '5',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200, Success):


[
    {
        "id": 161,
        "name": "Shuttle Berlin",
        "shortname": "BFST",
        "issue": 100,
        "project_id": 5,
        "offers": [],
        "options": []
    }
]
 

Request      

GET api/v1/ticket-types/{project_id}

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

project_id   string     

The ID of the project. Example: architecto

Query Parameters

project_id   integer     

The project to list ticket types for. Example: 5

Create a new ticket type.

requires authentication

Example request:
curl --request POST \
    "https://{instance}.festiware.eu/api/v1/ticket-types/architecto" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"Shuttle Berlin\",
    \"shortname\": \"BFST\",
    \"description\": \"Berlin Ostbahnhof to Festival\",
    \"issue\": 100,
    \"available_in_backend\": true,
    \"project_id\": 5
}"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/ticket-types/architecto"
);

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

let body = {
    "name": "Shuttle Berlin",
    "shortname": "BFST",
    "description": "Berlin Ostbahnhof to Festival",
    "issue": 100,
    "available_in_backend": true,
    "project_id": 5
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/ticket-types/architecto';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'Shuttle Berlin',
            'shortname' => 'BFST',
            'description' => 'Berlin Ostbahnhof to Festival',
            'issue' => 100,
            'available_in_backend' => true,
            'project_id' => 5,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (201, Created):


{
    "id": 161,
    "name": "Shuttle Berlin",
    "shortname": "BFST",
    "issue": 100,
    "project_id": 5,
    "offers": [],
    "options": []
}
 

Request      

POST api/v1/ticket-types/{project_id}

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

project_id   string     

The ID of the project. Example: architecto

Body Parameters

name   string     

Name of the ticket type. Example: Shuttle Berlin

shortname   string     

TicketCode prefix, 2-4 alphanumeric chars. Example: BFST

description   string  optional    

optional Description text. Example: Berlin Ostbahnhof to Festival

issue   integer  optional    

optional Maximum capacity (0 = unlimited, managed via options). Example: 100

available_in_backend   boolean  optional    

optional Whether visible in backend/admin. Default: true. Example: true

project_id   integer     

The project this ticket type belongs to. Example: 5

Show a single ticket type.

requires authentication

Example request:
curl --request GET \
    --get "https://{instance}.festiware.eu/api/v1/ticket-types/architecto/161" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/ticket-types/architecto/161"
);

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/ticket-types/architecto/161';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200, Success):


{
    "id": 161,
    "name": "Shuttle Berlin",
    "shortname": "BFST",
    "offers": [
        {
            "id": 1,
            "price": 39,
            "tax": 0.08
        }
    ],
    "options": [
        {
            "id": 1,
            "name": "Fr 09:00",
            "issue": 49
        }
    ]
}
 

Request      

GET api/v1/ticket-types/{project_id}/{ticket_type}

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

project_id   string     

The ID of the project. Example: architecto

ticket_type   integer     

The ticket type ID. Example: 161

Update a ticket type.

requires authentication

Example request:
curl --request PUT \
    "https://{instance}.festiware.eu/api/v1/ticket-types/architecto/161" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"Shuttle Berlin (Updated)\",
    \"shortname\": \"BFST\",
    \"description\": \"Eius et animi quos velit et.\",
    \"issue\": 200,
    \"available_in_backend\": false
}"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/ticket-types/architecto/161"
);

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

let body = {
    "name": "Shuttle Berlin (Updated)",
    "shortname": "BFST",
    "description": "Eius et animi quos velit et.",
    "issue": 200,
    "available_in_backend": false
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/ticket-types/architecto/161';
$response = $client->put(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'Shuttle Berlin (Updated)',
            'shortname' => 'BFST',
            'description' => 'Eius et animi quos velit et.',
            'issue' => 200,
            'available_in_backend' => false,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200, Updated):


{
    "id": 161,
    "name": "Shuttle Berlin (Updated)",
    "shortname": "BFST",
    "issue": 200
}
 

Request      

PUT api/v1/ticket-types/{project_id}/{ticket_type}

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

project_id   string     

The ID of the project. Example: architecto

ticket_type   integer     

The ticket type ID. Example: 161

Body Parameters

name   string  optional    

optional Name of the ticket type. Example: Shuttle Berlin (Updated)

shortname   string  optional    

optional TicketCode prefix, 2-4 alphanumeric chars. Example: BFST

description   string  optional    

optional Description text. Example: Eius et animi quos velit et.

issue   integer  optional    

optional Maximum capacity (0 = unlimited). Example: 200

available_in_backend   boolean  optional    

optional Whether visible in backend/admin. Example: false

Delete a ticket type.

requires authentication

Example request:
curl --request DELETE \
    "https://{instance}.festiware.eu/api/v1/ticket-types/architecto/161" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/ticket-types/architecto/161"
);

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


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/ticket-types/architecto/161';
$response = $client->delete(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200, Deleted):


{
    "success": true
}
 

Example response (409, Has offers):


{
    "error": "Cannot delete: ticket type has offers"
}
 

Example response (409, Has codes):


{
    "error": "Cannot delete: ticket type has ticket codes"
}
 

Request      

DELETE api/v1/ticket-types/{project_id}/{ticket_type}

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

project_id   string     

The ID of the project. Example: architecto

ticket_type   integer     

The ticket type ID. Example: 161

Bulk-create OfferableOptions (time slots / variants) for a TicketType.

requires authentication

POST /api/v1/ticket-types/{ticketType}/options/bulk

Example request:
curl --request POST \
    "https://{instance}.festiware.eu/api/v1/ticket-types/architecto/161/options/bulk" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"options\": [
        \"architecto\"
    ]
}"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/ticket-types/architecto/161/options/bulk"
);

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

let body = {
    "options": [
        "architecto"
    ]
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/ticket-types/architecto/161/options/bulk';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'options' => [
                'architecto',
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (201, Created):


{
    "count": 10,
    "options": [
        {
            "id": 1,
            "name": "Fr 09.07 — 08:00",
            "issue": 49,
            "active": true
        }
    ]
}
 

Request      

POST api/v1/ticket-types/{project_id}/{ticketType}/options/bulk

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

project_id   string     

The ID of the project. Example: architecto

ticketType   integer     

The ticket type ID. Example: 161

Body Parameters

options   string[]     

List of options to create.

name   string     

Display label (shown in shop dropdown). Example: Fr 09.07 — 08:00

description   string  optional    

optional Additional info. Example: Departure 08:00

issue   integer     

Capacity per option (e.g. 49 = one bus). 0 = unlimited. Example: 49

active   boolean     

Whether option is available in the shop. Example: true

valid_from   string  optional    

optional Date from which option is available. Example: 2026-07-01

valid_to   string  optional    

optional Date until option is available. Example: 2026-07-15

Delete a TicketType with all its Offers and OfferableOptions (cascade).

requires authentication

DELETE /api/v1/ticket-types/{ticketType}/cascade

Example request:
curl --request DELETE \
    "https://{instance}.festiware.eu/api/v1/ticket-types/architecto/161/cascade" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/ticket-types/architecto/161/cascade"
);

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


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/ticket-types/architecto/161/cascade';
$response = $client->delete(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200, Deleted):


{
    "success": true,
    "offers_deleted": 2,
    "options_deleted": 31
}
 

Example response (409, Has codes):


{
    "error": "Cannot delete: ticket type has ticket codes"
}
 

Example response (409, Has orders):


{
    "error": "Cannot delete: offers have existing orders"
}
 

Request      

DELETE api/v1/ticket-types/{project_id}/{ticketType}/cascade

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

project_id   string     

The ID of the project. Example: architecto

ticketType   integer     

The ticket type ID. Example: 161

Offer Categories

List offer categories for a project.

requires authentication

Example request:
curl --request GET \
    --get "https://{instance}.festiware.eu/api/v1/offer-categories/architecto?project_id=5" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/offer-categories/architecto"
);

const params = {
    "project_id": "5",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/offer-categories/architecto';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'project_id' => '5',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200, Success):


[
    {
        "id": 454,
        "name": "Outbound",
        "shortname": "out",
        "project_id": 5,
        "offers": []
    }
]
 

Request      

GET api/v1/offer-categories/{project_id}

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

project_id   string     

The ID of the project. Example: architecto

Query Parameters

project_id   integer     

The project to list categories for. Example: 5

Create a new offer category.

requires authentication

Example request:
curl --request POST \
    "https://{instance}.festiware.eu/api/v1/offer-categories/architecto" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"Outbound\",
    \"shortname\": \"out\",
    \"description\": \"Eius et animi quos velit et.\",
    \"project_id\": 5
}"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/offer-categories/architecto"
);

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

let body = {
    "name": "Outbound",
    "shortname": "out",
    "description": "Eius et animi quos velit et.",
    "project_id": 5
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/offer-categories/architecto';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'Outbound',
            'shortname' => 'out',
            'description' => 'Eius et animi quos velit et.',
            'project_id' => 5,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (201, Created):


{
    "id": 454,
    "name": "Outbound",
    "shortname": "out",
    "project_id": 5
}
 

Request      

POST api/v1/offer-categories/{project_id}

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

project_id   string     

The ID of the project. Example: architecto

Body Parameters

name   string     

Category display name (shown as group header in shop). Example: Outbound

shortname   string     

Short identifier. Must be unique per project. Example: out

description   string  optional    

optional Category description. Example: Eius et animi quos velit et.

project_id   integer     

The project this category belongs to. Example: 5

Show a single offer category.

requires authentication

Example request:
curl --request GET \
    --get "https://{instance}.festiware.eu/api/v1/offer-categories/architecto/454" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/offer-categories/architecto/454"
);

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/offer-categories/architecto/454';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200, Success):


{
    "id": 454,
    "name": "Outbound",
    "shortname": "out",
    "offers": [
        {
            "id": 1,
            "shortname": "Early Bird"
        }
    ]
}
 

Request      

GET api/v1/offer-categories/{project_id}/{offer_category}

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

project_id   string     

The ID of the project. Example: architecto

offer_category   integer     

The category ID. Example: 454

Update an offer category.

requires authentication

Example request:
curl --request PUT \
    "https://{instance}.festiware.eu/api/v1/offer-categories/architecto/454" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"Outbound (Renamed)\",
    \"shortname\": \"outbound\",
    \"description\": \"Eius et animi quos velit et.\"
}"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/offer-categories/architecto/454"
);

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

let body = {
    "name": "Outbound (Renamed)",
    "shortname": "outbound",
    "description": "Eius et animi quos velit et."
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/offer-categories/architecto/454';
$response = $client->put(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'Outbound (Renamed)',
            'shortname' => 'outbound',
            'description' => 'Eius et animi quos velit et.',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200, Updated):


{
    "id": 454,
    "name": "Outbound (Renamed)",
    "shortname": "outbound"
}
 

Request      

PUT api/v1/offer-categories/{project_id}/{offer_category}

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

project_id   string     

The ID of the project. Example: architecto

offer_category   integer     

The category ID. Example: 454

Body Parameters

name   string  optional    

optional Category display name. Example: Outbound (Renamed)

shortname   string  optional    

optional Short identifier. Example: outbound

description   string  optional    

optional Category description. Example: Eius et animi quos velit et.

Delete an offer category.

requires authentication

Example request:
curl --request DELETE \
    "https://{instance}.festiware.eu/api/v1/offer-categories/architecto/454" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/offer-categories/architecto/454"
);

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


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/offer-categories/architecto/454';
$response = $client->delete(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200, Deleted):


{
    "success": true
}
 

Example response (409, Has offers):


{
    "error": "Cannot delete: category has offers"
}
 

Request      

DELETE api/v1/offer-categories/{project_id}/{offer_category}

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

project_id   string     

The ID of the project. Example: architecto

offer_category   integer     

The category ID. Example: 454

Offerable Options

GET api/v1/offerable-options/{project_id}

requires authentication

Example request:
curl --request GET \
    --get "https://{instance}.festiware.eu/api/v1/offerable-options/architecto" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/offerable-options/architecto"
);

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/offerable-options/architecto';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (404):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 287
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "message": "Not Found",
    "errors": {
        "project_id": "Eintrag konnte nicht gefunden werden."
    }
}
 

Request      

GET api/v1/offerable-options/{project_id}

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

project_id   string     

The ID of the project. Example: architecto

POST api/v1/offerable-options/{project_id}

requires authentication

Example request:
curl --request POST \
    "https://{instance}.festiware.eu/api/v1/offerable-options/architecto" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"offerable_id\": 1,
    \"offerable_type\": \"App\\\\TicketType\",
    \"name\": \"Camping Add-On\",
    \"description\": \"Includes camping ground access\",
    \"issue\": 0,
    \"active\": true,
    \"valid_from\": \"2026-06-01\",
    \"valid_to\": \"2026-08-31\"
}"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/offerable-options/architecto"
);

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

let body = {
    "offerable_id": 1,
    "offerable_type": "App\\TicketType",
    "name": "Camping Add-On",
    "description": "Includes camping ground access",
    "issue": 0,
    "active": true,
    "valid_from": "2026-06-01",
    "valid_to": "2026-08-31"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/offerable-options/architecto';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'offerable_id' => 1,
            'offerable_type' => 'App\\TicketType',
            'name' => 'Camping Add-On',
            'description' => 'Includes camping ground access',
            'issue' => 0,
            'active' => true,
            'valid_from' => '2026-06-01',
            'valid_to' => '2026-08-31',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (404):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 286
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "message": "Not Found",
    "errors": {
        "project_id": "Eintrag konnte nicht gefunden werden."
    }
}
 

Request      

POST api/v1/offerable-options/{project_id}

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

project_id   string     

The ID of the project. Example: architecto

Body Parameters

offerable_id   integer     

ID of the related offerable (e.g. TicketType ID). Available ticket types can be fetched via GET /api/v1/ticket-types/{project_id}. Example: 1

offerable_type   string     

Fully qualified model class of the offerable. Example: App\TicketType

Must be one of:
  • App\TicketType
name   string     

Display name of the option. value darf nicht länger/größer als 255 Zeichen/Einträge sein. Example: Camping Add-On

description   string  optional    

Optional description. Example: Includes camping ground access

issue   integer     

Sort order (0-based). value muss mindestens 0 sein. Example: 0

active   boolean     

Whether this option is currently purchasable. Example: true

valid_from   string  optional    

Start date from which this option is valid. value ist kein gültiges Datum. Example: 2026-06-01

valid_to   string  optional    

End date until which this option is valid. Must be after valid_from. value ist kein gültiges Datum. value muss an einem Datum nach valid_from gewesen sein. Example: 2026-08-31

GET api/v1/offerable-options/{project_id}/{offerable_option}

requires authentication

Example request:
curl --request GET \
    --get "https://{instance}.festiware.eu/api/v1/offerable-options/architecto/architecto" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/offerable-options/architecto/architecto"
);

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/offerable-options/architecto/architecto';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (404):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 285
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "message": "Not Found",
    "errors": {
        "project_id": "Eintrag konnte nicht gefunden werden."
    }
}
 

Request      

GET api/v1/offerable-options/{project_id}/{offerable_option}

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

project_id   string     

The ID of the project. Example: architecto

offerable_option   string     

Example: architecto

PUT api/v1/offerable-options/{project_id}/{offerable_option}

requires authentication

Example request:
curl --request PUT \
    "https://{instance}.festiware.eu/api/v1/offerable-options/architecto/architecto" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"Camping Add-On\",
    \"description\": \"Includes camping ground access\",
    \"issue\": 0,
    \"active\": true,
    \"valid_from\": \"2026-06-01\",
    \"valid_to\": \"2026-08-31\"
}"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/offerable-options/architecto/architecto"
);

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

let body = {
    "name": "Camping Add-On",
    "description": "Includes camping ground access",
    "issue": 0,
    "active": true,
    "valid_from": "2026-06-01",
    "valid_to": "2026-08-31"
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/offerable-options/architecto/architecto';
$response = $client->put(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'Camping Add-On',
            'description' => 'Includes camping ground access',
            'issue' => 0,
            'active' => true,
            'valid_from' => '2026-06-01',
            'valid_to' => '2026-08-31',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (404):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 284
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "message": "Not Found",
    "errors": {
        "project_id": "Eintrag konnte nicht gefunden werden."
    }
}
 

Request      

PUT api/v1/offerable-options/{project_id}/{offerable_option}

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

project_id   string     

The ID of the project. Example: architecto

offerable_option   string     

Example: architecto

Body Parameters

name   string  optional    

Display name of the option. value darf nicht länger/größer als 255 Zeichen/Einträge sein. Example: Camping Add-On

description   string  optional    

Optional description. Example: Includes camping ground access

issue   integer  optional    

Sort order (0-based). value muss mindestens 0 sein. Example: 0

active   boolean  optional    

Whether this option is currently purchasable. Example: true

valid_from   string  optional    

Start date from which this option is valid. value ist kein gültiges Datum. Example: 2026-06-01

valid_to   string  optional    

End date until which this option is valid. Must be after valid_from. value ist kein gültiges Datum. value muss an einem Datum nach valid_from gewesen sein. Example: 2026-08-31

DELETE api/v1/offerable-options/{project_id}/{offerable_option}

requires authentication

Example request:
curl --request DELETE \
    "https://{instance}.festiware.eu/api/v1/offerable-options/architecto/architecto" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/offerable-options/architecto/architecto"
);

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


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/offerable-options/architecto/architecto';
$response = $client->delete(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (404):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 283
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "message": "Not Found",
    "errors": {
        "project_id": "Eintrag konnte nicht gefunden werden."
    }
}
 

Request      

DELETE api/v1/offerable-options/{project_id}/{offerable_option}

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

project_id   string     

The ID of the project. Example: architecto

offerable_option   string     

Example: architecto

Ticket Shop

Create a complete project setup in one call.

requires authentication

POST /api/v1/offers/setup-project

Example request:
curl --request POST \
    "https://{instance}.festiware.eu/api/v1/offers/setup-project" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"project_id\": 5,
    \"ticket_types\": [
        {
            \"offer_category\": {
                \"id\": 454,
                \"name\": \"Outbound\",
                \"shortname\": \"out\"
            },
            \"offer\": {
                \"price\": \"39.00\",
                \"tax\": \"0.08\",
                \"tax_rules\": [
                    \"architecto\"
                ],
                \"shortname\": \"Shuttle Hin\",
                \"max_order_amount\": 8,
                \"published\": true
            }
        }
    ]
}"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/offers/setup-project"
);

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

let body = {
    "project_id": 5,
    "ticket_types": [
        {
            "offer_category": {
                "id": 454,
                "name": "Outbound",
                "shortname": "out"
            },
            "offer": {
                "price": "39.00",
                "tax": "0.08",
                "tax_rules": [
                    "architecto"
                ],
                "shortname": "Shuttle Hin",
                "max_order_amount": 8,
                "published": true
            }
        }
    ]
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/offers/setup-project';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'project_id' => 5,
            'ticket_types' => [
                [
                    'offer_category' => [
                        'id' => 454,
                        'name' => 'Outbound',
                        'shortname' => 'out',
                    ],
                    'offer' => [
                        'price' => '39.00',
                        'tax' => '0.08',
                        'tax_rules' => [
                            'architecto',
                        ],
                        'shortname' => 'Shuttle Hin',
                        'max_order_amount' => 8,
                        'published' => true,
                    ],
                ],
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (201, Created):


[
    {
        "ticket_type": {
            "id": 161
        },
        "offer_category": {
            "id": 454
        },
        "offer": {
            "id": 1
        },
        "options_count": 10,
        "options": []
    }
]
 

Request      

POST api/v1/offers/setup-project

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

project_id   integer     

The project to create the structure in. Example: 5

ticket_types   string[]     

List of ticket types to create (min 1).

name   string     

Display name. Example: Shuttle Berlin

shortname   string     

2-4 alphanumeric prefix. Example: BFST

description   string  optional    

optional Description. Example: Eius et animi quos velit et.

offer_category   object     

Category (existing or new).

id   integer  optional    

optional Existing category ID. Example: 454

name   string  optional    

optional Name for new category. Required if no id. Example: Outbound

shortname   string  optional    

optional Shortname for new category. Required if no id. Example: out

offer   object     

Offer configuration.

price   numeric     

Gross price in EUR. Example: 39.00

tax   numeric     

Tax rate as decimal (0.0-1.0). Example: 0.08

tax_rules   string[]  optional    

optional Simplified tax rules (auto-wrapped to Nova Flexible format).

label   string     

Rule label. Example: Tax Germany

percent   numeric     

Price split as decimal. Example: 0.509

rate   numeric     

Tax rate as decimal. Example: 0

shortname   string     

Offer display name. Example: Shuttle Hin

max_order_amount   integer  optional    

optional Max per order. Default: 8. Example: 8

published   boolean  optional    

optional Set published_from + available_from to now. Example: true

options   string[]  optional    

optional Time slots / variants.

name   string     

Display label. Example: Fr 09.07 — 08:00

description   string  optional    

optional Info text. Example: Departure 08:00

issue   integer     

Capacity. Example: 49

Create a new offer.

requires authentication

Example request:
curl --request POST \
    "https://{instance}.festiware.eu/api/v1/offers/architecto" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"offerable_id\": 161,
    \"offerable_type\": \"App\\\\TicketType\",
    \"price\": \"39.00\",
    \"tax\": \"0.08\",
    \"tax_rules\": [
        {
            \"attributes\": {
                \"label\": \"Tax Germany\",
                \"percent\": \"0.509\",
                \"rate\": \"0.08\"
            }
        }
    ],
    \"issue\": 100,
    \"shortname\": \"Early Bird Ticket\",
    \"description\": \"Eius et animi quos velit et.\",
    \"offer_category_id\": 454,
    \"email_product\": false,
    \"max_order_amount\": 4,
    \"published_from\": \"2026-06-01\",
    \"published_to\": \"2026-07-15\",
    \"available_from\": \"2026-07-01\",
    \"available_to\": \"2026-07-10\",
    \"hidden_link\": \"architecto\"
}"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/offers/architecto"
);

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

let body = {
    "offerable_id": 161,
    "offerable_type": "App\\TicketType",
    "price": "39.00",
    "tax": "0.08",
    "tax_rules": [
        {
            "attributes": {
                "label": "Tax Germany",
                "percent": "0.509",
                "rate": "0.08"
            }
        }
    ],
    "issue": 100,
    "shortname": "Early Bird Ticket",
    "description": "Eius et animi quos velit et.",
    "offer_category_id": 454,
    "email_product": false,
    "max_order_amount": 4,
    "published_from": "2026-06-01",
    "published_to": "2026-07-15",
    "available_from": "2026-07-01",
    "available_to": "2026-07-10",
    "hidden_link": "architecto"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/offers/architecto';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'offerable_id' => 161,
            'offerable_type' => 'App\\TicketType',
            'price' => '39.00',
            'tax' => '0.08',
            'tax_rules' => [
                [
                    'attributes' => [
                        'label' => 'Tax Germany',
                        'percent' => '0.509',
                        'rate' => '0.08',
                    ],
                ],
            ],
            'issue' => 100,
            'shortname' => 'Early Bird Ticket',
            'description' => 'Eius et animi quos velit et.',
            'offer_category_id' => 454,
            'email_product' => false,
            'max_order_amount' => 4,
            'published_from' => '2026-06-01',
            'published_to' => '2026-07-15',
            'available_from' => '2026-07-01',
            'available_to' => '2026-07-10',
            'hidden_link' => 'architecto',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (201, Created):


{
    "id": 1,
    "price": 39,
    "tax": 0.08,
    "shortname": "Early Bird Ticket",
    "project_id": 5
}
 

Request      

POST api/v1/offers/{project_id}

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

project_id   string     

The ID of the project. Example: architecto

Body Parameters

offerable_id   integer     

ID of the parent TicketType. Example: 161

offerable_type   string     

Polymorphic type. Currently only App\TicketType. Example: App\TicketType

price   numeric     

Final gross price in EUR. Example: 39.00

tax   numeric     

Tax rate as decimal (0.08 = 8%). Must be 0.0-1.0. Example: 0.08

tax_rules   string[]  optional    

optional Complex split-tax rules in Nova Flexible format. Each rule: {layout, key, attributes: {label, percent, rate}}.

layout   string     

Layout identifier. Example: tax_rule

key   string     

Unique key. Example: tr1

attributes   object  optional    

This field is required when tax_rules is present.

label   string     

Tax rule label. Example: Tax Germany

percent   numeric     

Split of ticket price as decimal (0.509 = 50.9%). Example: 0.509

rate   numeric     

Tax rate as decimal (0.08 = 8%). Example: 0.08

issue   integer  optional    

optional Total stock (0 = unlimited). Example: 100

shortname   string     

Offer name / article number (shown as title in shop). Example: Early Bird Ticket

description   string  optional    

optional Description shown below the title in the shop. Example: Eius et animi quos velit et.

offer_category_id   integer     

FK to offer categories. Groups offers in shop. Example: 454

email_product   boolean  optional    

optional Whether product is delivered via email. Default: true. Example: false

max_order_amount   integer  optional    

optional Maximum purchasable per order. Default: 8. Example: 4

published_from   string  optional    

optional Start of editorial visibility window. Example: 2026-06-01

published_to   string  optional    

optional End of editorial visibility window. Example: 2026-07-15

available_from   string  optional    

optional Start of purchase availability window. Example: 2026-07-01

available_to   string  optional    

optional End of purchase availability window. Example: 2026-07-10

hidden_link   string  optional    

optional If set, offer is hidden from public shop and only reachable via URL suffix ?shop_link=VALUE. Example: architecto

Show a single offer.

requires authentication

Example request:
curl --request GET \
    --get "https://{instance}.festiware.eu/api/v1/offers/architecto/1" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/offers/architecto/1"
);

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/offers/architecto/1';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200, Success):


{
    "id": 1,
    "price": 39,
    "tax": 0.08,
    "shortname": "Early Bird",
    "offerable": {
        "id": 161,
        "name": "Shuttle"
    },
    "offer_category": {
        "id": 454,
        "name": "Outbound"
    }
}
 

Request      

GET api/v1/offers/{project_id}/{offer}

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

project_id   string     

The ID of the project. Example: architecto

offer   integer     

The offer ID. Example: 1

Update an offer.

requires authentication

Example request:
curl --request PUT \
    "https://{instance}.festiware.eu/api/v1/offers/architecto/1" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"price\": \"45.00\",
    \"tax\": \"0.19\",
    \"tax_rules\": [
        {
            \"layout\": \"rule\",
            \"key\": \"abc123\",
            \"attributes\": {
                \"label\": \"Reduced VAT\",
                \"percent\": 1,
                \"rate\": 0.07
            }
        }
    ],
    \"issue\": 0,
    \"shortname\": \"Late Bird Ticket\",
    \"description\": \"Eius et animi quos velit et.\",
    \"offer_category_id\": 5,
    \"email_product\": false,
    \"max_order_amount\": 4,
    \"published_from\": \"2026-06-01\",
    \"published_to\": \"2026-07-15\",
    \"available_from\": \"2026-07-01\",
    \"available_to\": \"2026-07-10\",
    \"hidden_link\": \"architecto\"
}"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/offers/architecto/1"
);

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

let body = {
    "price": "45.00",
    "tax": "0.19",
    "tax_rules": [
        {
            "layout": "rule",
            "key": "abc123",
            "attributes": {
                "label": "Reduced VAT",
                "percent": 1,
                "rate": 0.07
            }
        }
    ],
    "issue": 0,
    "shortname": "Late Bird Ticket",
    "description": "Eius et animi quos velit et.",
    "offer_category_id": 5,
    "email_product": false,
    "max_order_amount": 4,
    "published_from": "2026-06-01",
    "published_to": "2026-07-15",
    "available_from": "2026-07-01",
    "available_to": "2026-07-10",
    "hidden_link": "architecto"
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/offers/architecto/1';
$response = $client->put(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'price' => '45.00',
            'tax' => '0.19',
            'tax_rules' => [
                [
                    'layout' => 'rule',
                    'key' => 'abc123',
                    'attributes' => [
                        'label' => 'Reduced VAT',
                        'percent' => 1.0,
                        'rate' => 0.07,
                    ],
                ],
            ],
            'issue' => 0,
            'shortname' => 'Late Bird Ticket',
            'description' => 'Eius et animi quos velit et.',
            'offer_category_id' => 5,
            'email_product' => false,
            'max_order_amount' => 4,
            'published_from' => '2026-06-01',
            'published_to' => '2026-07-15',
            'available_from' => '2026-07-01',
            'available_to' => '2026-07-10',
            'hidden_link' => 'architecto',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200, Updated):


{
    "id": 1,
    "price": 45,
    "tax": 0.19,
    "shortname": "Late Bird Ticket"
}
 

Request      

PUT api/v1/offers/{project_id}/{offer}

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

project_id   string     

The ID of the project. Example: architecto

offer   integer     

The offer ID. Example: 1

Body Parameters

price   numeric  optional    

optional Final gross price in EUR. Example: 45.00

tax   numeric  optional    

optional Tax rate as decimal (0.0-1.0). Example: 0.19

tax_rules   object[]  optional    

Split tax rules in Nova Flexible JSON format. Each rule has layout, key, and attributes (label, percent as share of price, rate as tax rate). All values as decimals (0.0–1.0).

layout   string  optional    

Example: architecto

key   string  optional    

Example: architecto

attributes   object  optional    

This field is required when tax_rules is present.

label   string  optional    

This field is required when tax_rules.*.attributes is present. value darf nicht länger/größer als 50 Zeichen/Einträge sein. Example: n

percent   number  optional    

This field is required when tax_rules.*.attributes is present. value muss mindestens 0 sein. value darf nicht größer als 1 sein. Example: 1

rate   number  optional    

This field is required when tax_rules.*.attributes is present. value muss mindestens 0 sein. value darf nicht größer als 1 sein. Example: 1

issue   integer  optional    

Sort order (0-based). value muss mindestens 0 sein. Example: 0

shortname   string  optional    

optional Offer name / article number. Example: Late Bird Ticket

description   string  optional    

optional Description. Example: Eius et animi quos velit et.

offer_category_id   string  optional    

ID of the offer category. Available categories can be fetched via GET /api/v1/offer-categories/{project_id}. The id of an existing record in the types table. Example: 5

email_product   boolean  optional    

optional Email delivery flag. Example: false

max_order_amount   integer  optional    

optional Max per order. Example: 4

published_from   string  optional    

optional Start of visibility. Example: 2026-06-01

published_to   string  optional    

optional End of visibility. Example: 2026-07-15

available_from   string  optional    

optional Start of availability. Example: 2026-07-01

available_to   string  optional    

optional End of availability. Example: 2026-07-10

hidden_link   string  optional    

optional Hidden shop link value. Example: architecto

Delete an offer.

requires authentication

Example request:
curl --request DELETE \
    "https://{instance}.festiware.eu/api/v1/offers/architecto/1" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/offers/architecto/1"
);

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


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/offers/architecto/1';
$response = $client->delete(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200, Deleted):


{
    "success": true
}
 

Example response (409, Has orders):


{
    "error": "Cannot delete: offer has existing orders"
}
 

Request      

DELETE api/v1/offers/{project_id}/{offer}

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

project_id   string     

The ID of the project. Example: architecto

offer   integer     

The offer ID. Example: 1

Clone an Offer (and its TicketType's options) to another project.

requires authentication

POST /api/v1/offers/{offer}/clone

Example request:
curl --request POST \
    "https://{instance}.festiware.eu/api/v1/offers/architecto/1/clone" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"target_project_id\": 6,
    \"price_override\": \"42.00\"
}"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/offers/architecto/1/clone"
);

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

let body = {
    "target_project_id": 6,
    "price_override": "42.00"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/offers/architecto/1/clone';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'target_project_id' => 6,
            'price_override' => '42.00',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (201, Cloned):


{
    "ticket_type": {
        "id": 162
    },
    "offer": {
        "id": 2
    },
    "options_cloned": 13
}
 

Request      

POST api/v1/offers/{project_id}/{offer}/clone

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

project_id   string     

The ID of the project. Example: architecto

offer   integer     

The source offer ID to clone. Example: 1

Body Parameters

target_project_id   integer     

The project to clone into. Example: 6

price_override   numeric  optional    

optional Override the cloned offer's price. Example: 42.00

Display a listing of the resource.

requires authentication

Example request:
curl --request GET \
    --get "https://{instance}.festiware.eu/api/v1/offers" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/offers"
);

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/offers';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 282
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

[]
 

Request      

GET api/v1/offers

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Display a listing of available Offers.

requires authentication

Example request:
curl --request GET \
    --get "https://{instance}.festiware.eu/api/v1/offers/available" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/offers/available"
);

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/offers/available';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (500):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 281
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "message": "Server Error"
}
 

Request      

GET api/v1/offers/available

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Display a listing of available Offers.

requires authentication

Example request:
curl --request GET \
    --get "https://{instance}.festiware.eu/api/v1/offers/available/architecto" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/offers/available/architecto"
);

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/offers/available/architecto';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (404):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 280
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "message": "Not Found",
    "errors": {
        "project_id": "Eintrag konnte nicht gefunden werden."
    }
}
 

Request      

GET api/v1/offers/available/{projectShort}

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

projectShort   string     

Example: architecto

GET api/v1/owner/{ownerCode}

requires authentication

Example request:
curl --request GET \
    --get "https://{instance}.festiware.eu/api/v1/owner/architecto" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/owner/architecto"
);

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/owner/architecto';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 279
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

[]
 

Request      

GET api/v1/owner/{ownerCode}

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

ownerCode   string     

Example: architecto

Internal API

Permissions

Returns the Permissions and Roles of the current user

requires authentication

Example request:
curl --request GET \
    --get "https://{instance}.festiware.eu/api/v1/user-permissions" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/user-permissions"
);

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/user-permissions';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (500):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 299
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "message": "Server Error"
}
 

Request      

GET api/v1/user-permissions

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Time Tracking

POST api/v1/jobs/admin_stats

requires authentication

Required permission: time_tracking

Example request:
curl --request POST \
    "https://{instance}.festiware.eu/api/v1/jobs/admin_stats" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/jobs/admin_stats"
);

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


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/jobs/admin_stats';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (500):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 251
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "message": "Server Error"
}
 

Request      

POST api/v1/jobs/admin_stats

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

POST api/v1/jobs/check_assigned

requires authentication

Required permission: time_tracking

Example request:
curl --request POST \
    "https://{instance}.festiware.eu/api/v1/jobs/check_assigned" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/jobs/check_assigned"
);

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


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/jobs/check_assigned';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (500):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 250
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "message": "Server Error"
}
 

Request      

POST api/v1/jobs/check_assigned

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

POST api/v1/jobs/check_in

requires authentication

Required permission: time_tracking

Example request:
curl --request POST \
    "https://{instance}.festiware.eu/api/v1/jobs/check_in" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/jobs/check_in"
);

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


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/jobs/check_in';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (500):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 249
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "message": "Server Error"
}
 

Request      

POST api/v1/jobs/check_in

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

POST api/v1/jobs/check_in_adhoc

requires authentication

Required permission: time_tracking

Example request:
curl --request POST \
    "https://{instance}.festiware.eu/api/v1/jobs/check_in_adhoc" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/jobs/check_in_adhoc"
);

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


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/jobs/check_in_adhoc';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (500):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 248
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "message": "Server Error"
}
 

Request      

POST api/v1/jobs/check_in_adhoc

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

POST api/v1/jobs/check_out

requires authentication

Required permission: time_tracking

Example request:
curl --request POST \
    "https://{instance}.festiware.eu/api/v1/jobs/check_out" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://{instance}.festiware.eu/api/v1/jobs/check_out"
);

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


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://{instance}.festiware.eu/api/v1/jobs/check_out';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (500):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 300
x-ratelimit-remaining: 247
access-control-allow-origin: *
access-control-expose-headers: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
 

{
    "message": "Server Error"
}
 

Request      

POST api/v1/jobs/check_out

Headers

Authorization        

Example: Bearer {ACCESS_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json