openapi: 3.1.0
info:
title: 'Flexxr Backend API Documentation'
description: 'REST API for the Flexxr staffing platform. Manage employees, organizations, jobs, shifts, and more.'
version: 1.0.0
servers:
-
url: 'https://backend-dev.flexxr.at'
tags:
-
name: 'Public API'
description: 'Publicly accessible endpoints that do not require authentication. Use these for browsing jobs, organizations, and app settings.'
-
name: 'Mobile API'
description: 'Endpoints for the mobile application (employee users). All endpoints (except authentication) require a valid Bearer token with 2FA verification.'
-
name: 'Admin API'
description: 'Admin dashboard endpoints for platform management. Requires admin-level Bearer token authentication.'
-
name: 'Organization API'
description: 'Endpoints for the mobile application (employee users). All endpoints (except authentication) require a valid Bearer token with 2FA verification.'
-
name: 'Admin - Employees'
description: 'Admin dashboard endpoints for platform management. Requires admin-level Bearer token authentication.'
-
name: 'Admin - LHR Payroll'
description: 'Admin dashboard endpoints for platform management. Requires admin-level Bearer token authentication.'
-
name: 'Admin - Shifts'
description: 'Admin dashboard endpoints for platform management. Requires admin-level Bearer token authentication.'
-
name: 'Company - Assignments'
description: 'Organization (Company Portal) endpoints for managing jobs, applicants, shifts, team, and organization profiles. Requires organization-level Bearer token. Some endpoints require approved organization status.'
-
name: 'Company - Attendance'
description: 'Organization (Company Portal) endpoints for managing jobs, applicants, shifts, team, and organization profiles. Requires organization-level Bearer token. Some endpoints require approved organization status.'
-
name: 'Company - Auth'
description: 'Organization (Company Portal) endpoints for managing jobs, applicants, shifts, team, and organization profiles. Requires organization-level Bearer token. Some endpoints require approved organization status.'
-
name: 'Company - Billing'
description: 'Organization (Company Portal) endpoints for managing jobs, applicants, shifts, team, and organization profiles. Requires organization-level Bearer token. Some endpoints require approved organization status.'
-
name: 'Company - Jobs'
description: 'Organization (Company Portal) endpoints for managing jobs, applicants, shifts, team, and organization profiles. Requires organization-level Bearer token. Some endpoints require approved organization status.'
-
name: 'Company - No-Show'
description: 'Organization (Company Portal) endpoints for managing jobs, applicants, shifts, team, and organization profiles. Requires organization-level Bearer token. Some endpoints require approved organization status.'
-
name: 'Company - No-Shows'
description: 'Organization (Company Portal) endpoints for managing jobs, applicants, shifts, team, and organization profiles. Requires organization-level Bearer token. Some endpoints require approved organization status.'
-
name: 'Company - Reports'
description: 'Organization (Company Portal) endpoints for managing jobs, applicants, shifts, team, and organization profiles. Requires organization-level Bearer token. Some endpoints require approved organization status.'
-
name: 'Company - Shifts'
description: 'Organization (Company Portal) endpoints for managing jobs, applicants, shifts, team, and organization profiles. Requires organization-level Bearer token. Some endpoints require approved organization status.'
-
name: 'Company - Wallet'
description: 'Organization (Company Portal) endpoints for managing jobs, applicants, shifts, team, and organization profiles. Requires organization-level Bearer token. Some endpoints require approved organization status.'
-
name: 'Employee - Shifts'
description: 'Endpoints for the mobile application (employee users). All endpoints (except authentication) require a valid Bearer token with 2FA verification.'
-
name: 'Employee - Wallet'
description: 'Endpoints for the mobile application (employee users). All endpoints (except authentication) require a valid Bearer token with 2FA verification.'
-
name: 'Mobile - Profile'
description: 'Endpoints for the mobile application (employee users). All endpoints (except authentication) require a valid Bearer token with 2FA verification.'
components:
securitySchemes:
default:
type: http
scheme: bearer
description: 'Obtain a token via the login endpoint for your guard (mobile, org, or admin). Include it as `Bearer {token}` in the Authorization header.'
security:
-
default: []
paths:
/api/v1/health:
get:
summary: 'Health check endpoint for infrastructure monitoring.'
operationId: healthCheckEndpointForInfrastructureMonitoring
description: 'Returns system health status including database, cache, and storage connectivity.'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- healthy
timestamp:
type: string
examples:
- '2026-08-05T16:18:33+00:00'
checks:
type: object
properties:
database:
type: object
properties:
status:
type: string
examples:
- ok
latency_ms:
type: number
examples:
- 3.4
cache:
type: object
properties:
status:
type: string
examples:
- ok
latency_ms:
type: number
examples:
- 0.31
storage:
type: object
properties:
status:
type: string
examples:
- ok
latency_ms:
type: number
examples:
- 0.06
examples:
-
status: healthy
timestamp: '2026-08-05T16:18:33+00:00'
checks:
database:
status: ok
latency_ms: 3.4
cache:
status: ok
latency_ms: 0.31
storage:
status: ok
latency_ms: 0.06
503:
description: Degraded
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- degraded
timestamp:
type: string
examples:
- '2026-06-11T10:00:00.000000Z'
checks:
type: object
properties:
database:
type: object
properties:
status:
type: string
examples:
- error
latency_ms:
type:
- string
- 'null'
examples:
- null
error:
type: string
examples:
- 'Connection refused'
cache:
type: object
properties:
status:
type: string
examples:
- ok
latency_ms:
type: number
examples:
- 1.2
storage:
type: object
properties:
status:
type: string
examples:
- ok
latency_ms:
type: number
examples:
- 3.1
examples:
-
status: degraded
timestamp: '2026-06-11T10:00:00.000000Z'
checks:
database:
status: error
latency_ms: null
error: 'Connection refused'
cache:
status: ok
latency_ms: 1.2
storage:
status: ok
latency_ms: 3.1
tags:
- 'Public API'
security: []
/api/v1/public/jobs:
get:
summary: 'List Public Jobs'
operationId: listPublicJobs
description: "Browse available jobs without authentication. Returns limited information\nto encourage registration. Only shows active jobs with future deadlines."
parameters:
-
in: query
name: category
description: 'Filter by job category.'
required: false
schema:
type: string
description: 'Filter by job category.'
examples:
- gastronomy
-
in: query
name: city
description: 'Filter by city.'
required: false
schema:
type: string
description: 'Filter by city.'
examples:
- Wien
-
in: query
name: lat
description: 'Latitude for radius search.'
required: false
schema:
type: number
description: 'Latitude for radius search.'
examples:
- 48.2082
-
in: query
name: lng
description: 'Longitude for radius search.'
required: false
schema:
type: number
description: 'Longitude for radius search.'
examples:
- 16.3738
-
in: query
name: radius
description: 'Radius in km (requires lat/lng).'
required: false
schema:
type: integer
description: 'Radius in km (requires lat/lng).'
examples:
- 25
-
in: query
name: start_date
description: 'date Filter jobs starting on or after this date.'
required: false
schema:
type: string
description: 'date Filter jobs starting on or after this date.'
examples:
- '2026-06-15'
-
in: query
name: end_date
description: 'date Filter jobs ending on or before this date.'
required: false
schema:
type: string
description: 'date Filter jobs ending on or before this date.'
examples:
- '2026-07-15'
-
in: query
name: per_page
description: 'Items per page (max 20).'
required: false
schema:
type: integer
description: 'Items per page (max 20).'
examples:
- 10
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
jobs:
type: array
examples:
- []
pagination:
type: object
properties:
current_page:
type: integer
examples:
- 1
last_page:
type: integer
examples:
- 1
per_page:
type: integer
examples:
- 10
total:
type: integer
examples:
- 0
message:
type: string
examples:
- 'Register or log in to apply for this job.'
examples:
-
status: SUCCESS
data:
jobs: []
pagination:
current_page: 1
last_page: 1
per_page: 10
total: 0
message: 'Register or log in to apply for this job.'
tags:
- 'Public API'
security: []
'/api/v1/public/jobs/{jobId}':
get:
summary: 'Get Public Job Details'
operationId: getPublicJobDetails
description: "View details of a specific job without authentication. Returns limited\ninformation (no exact wage, no contact details) to encourage registration."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
job:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-28c4-732f-a94c-fb5a71a7d682
title:
type: string
examples:
- Accountant
description:
type: string
examples:
- 'Ut nostrum rerum ut alias quia libero excepturi. Voluptatum et aut non quia quisquam molestias. Perferendis qui hic unde.'
category:
type: object
properties:
id:
type: string
examples:
- 019fd2b7-f39f-73e6-870b-fe7584e4f9bc
slug:
type: string
examples:
- office
name:
type: string
examples:
- Büro
name_localized:
type: string
examples:
- Office
icon:
type: string
examples:
- briefcase
color:
type:
- string
- 'null'
examples:
- null
location_city:
type: string
examples:
- 'East Eliseo'
start_date:
type: string
examples:
- '2026-08-12'
end_date:
type: string
examples:
- '2026-08-19'
shift_types:
type:
- string
- 'null'
examples:
- null
shift_start_time:
type: string
examples:
- '01:49:00'
shift_end_time:
type: string
examples:
- '18:57:00'
workers_needed:
type:
- string
- 'null'
examples:
- null
wage_hint:
type:
- string
- 'null'
examples:
- null
requirements:
type: object
properties:
qualifications:
type: array
examples:
- []
languages:
type:
- string
- 'null'
examples:
- null
organization:
type: object
properties:
name:
type: string
examples:
- Caritas
logo_url:
type:
- string
- 'null'
examples:
- null
city:
type: string
examples:
- Vienna
application_deadline:
type: string
examples:
- '2026-09-05 16:18'
message:
type: string
examples:
- 'Register or log in to apply for this job.'
examples:
-
status: SUCCESS
data:
job:
id: 019fd2b8-28c4-732f-a94c-fb5a71a7d682
title: Accountant
description: 'Ut nostrum rerum ut alias quia libero excepturi. Voluptatum et aut non quia quisquam molestias. Perferendis qui hic unde.'
category:
id: 019fd2b7-f39f-73e6-870b-fe7584e4f9bc
slug: office
name: Büro
name_localized: Office
icon: briefcase
color: null
location_city: 'East Eliseo'
start_date: '2026-08-12'
end_date: '2026-08-19'
shift_types: null
shift_start_time: '01:49:00'
shift_end_time: '18:57:00'
workers_needed: null
wage_hint: null
requirements:
qualifications: []
languages: null
organization:
name: Caritas
logo_url: null
city: Vienna
application_deadline: '2026-09-05 16:18'
message: 'Register or log in to apply for this job.'
404:
description: 'Not Found'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- RESOURCE_NOT_FOUND
message:
type: string
examples:
- 'Job not found.'
examples:
-
status: RESOURCE_NOT_FOUND
message: 'Job not found.'
tags:
- 'Public API'
security: []
parameters:
-
in: path
name: jobId
description: 'The job UUID.'
required: true
schema:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
/api/v1/public/legal:
get:
summary: 'List Legal Documents'
operationId: listLegalDocuments
description: 'List all active legal documents (public endpoint, no auth required).'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Legal documents retrieved.'
data:
type: object
properties:
documents:
type: array
items:
type: object
properties:
id:
type: string
examples:
- 019fd2b7-ef7c-732a-b29e-ef789f899c9d
type:
type: string
examples:
- aug_info
title:
type: string
examples:
- 'Information gemäß AÜG (Arbeitskräfteüberlassungsgesetz)'
version:
type: integer
examples:
- 1
locale:
type: string
examples:
- de
published_at:
type: string
examples:
- '2026-08-05T16:18:17+00:00'
requires_reacceptance:
type: boolean
examples:
- false
examples:
-
-
id: 019fd2b7-ef7c-732a-b29e-ef789f899c9d
type: aug_info
title: 'Information gemäß AÜG (Arbeitskräfteüberlassungsgesetz)'
version: 1
locale: de
published_at: '2026-08-05T16:18:17+00:00'
requires_reacceptance: false
-
id: 019fd2b7-ef86-70be-8580-5a1ac1757a9a
type: cookie_policy
title: Cookie-Richtlinie
version: 1
locale: de
published_at: '2026-08-05T16:18:17+00:00'
requires_reacceptance: false
-
id: 019fd2b7-ef76-73b5-a9c5-d7cca778324b
type: data_processing
title: 'Einwilligung zur Datenverarbeitung'
version: 1
locale: de
published_at: '2026-08-05T16:18:17+00:00'
requires_reacceptance: true
-
id: 019fd2b7-ef8a-7286-ada6-84f13beb905f
type: imprint
title: Impressum
version: 1
locale: de
published_at: '2026-08-05T16:18:17+00:00'
requires_reacceptance: false
-
id: 019fd2b7-ef68-7312-a1a3-6b14820cf9e2
type: privacy_policy
title: Datenschutzerklärung
version: 1
locale: de
published_at: '2026-08-05T16:18:17+00:00'
requires_reacceptance: true
-
id: 019fd2b7-ef83-7298-a78c-af4b1e36b67b
type: svnr_consent
title: 'Einwilligung zur Verarbeitung der Sozialversicherungsnummer'
version: 1
locale: de
published_at: '2026-08-05T16:18:17+00:00'
requires_reacceptance: true
-
id: 019fd2b7-ef6f-72ae-8c86-d9977da26ec0
type: terms_of_service
title: 'Allgemeine Geschäftsbedingungen (AGB)'
version: 1
locale: de
published_at: '2026-08-05T16:18:17+00:00'
requires_reacceptance: true
available_locales:
type: array
items:
type: string
examples:
-
- de
- en
examples:
-
status: SUCCESS
message: 'Legal documents retrieved.'
data:
documents:
-
id: 019fd2b7-ef7c-732a-b29e-ef789f899c9d
type: aug_info
title: 'Information gemäß AÜG (Arbeitskräfteüberlassungsgesetz)'
version: 1
locale: de
published_at: '2026-08-05T16:18:17+00:00'
requires_reacceptance: false
-
id: 019fd2b7-ef86-70be-8580-5a1ac1757a9a
type: cookie_policy
title: Cookie-Richtlinie
version: 1
locale: de
published_at: '2026-08-05T16:18:17+00:00'
requires_reacceptance: false
-
id: 019fd2b7-ef76-73b5-a9c5-d7cca778324b
type: data_processing
title: 'Einwilligung zur Datenverarbeitung'
version: 1
locale: de
published_at: '2026-08-05T16:18:17+00:00'
requires_reacceptance: true
-
id: 019fd2b7-ef8a-7286-ada6-84f13beb905f
type: imprint
title: Impressum
version: 1
locale: de
published_at: '2026-08-05T16:18:17+00:00'
requires_reacceptance: false
-
id: 019fd2b7-ef68-7312-a1a3-6b14820cf9e2
type: privacy_policy
title: Datenschutzerklärung
version: 1
locale: de
published_at: '2026-08-05T16:18:17+00:00'
requires_reacceptance: true
-
id: 019fd2b7-ef83-7298-a78c-af4b1e36b67b
type: svnr_consent
title: 'Einwilligung zur Verarbeitung der Sozialversicherungsnummer'
version: 1
locale: de
published_at: '2026-08-05T16:18:17+00:00'
requires_reacceptance: true
-
id: 019fd2b7-ef6f-72ae-8c86-d9977da26ec0
type: terms_of_service
title: 'Allgemeine Geschäftsbedingungen (AGB)'
version: 1
locale: de
published_at: '2026-08-05T16:18:17+00:00'
requires_reacceptance: true
available_locales:
- de
- en
tags:
- 'Public API'
security: []
'/api/v1/public/legal/latest/{type}':
get:
summary: 'Get Latest Legal Document'
operationId: getLatestLegalDocument
description: 'Get the latest active version of a legal document by type (public endpoint).'
parameters: []
responses:
503:
description: ''
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- ERROR
message:
type: string
examples:
- 'Service Unavailable'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type:
- string
- 'null'
examples:
- null
message:
type: string
examples:
- 'Service Unavailable'
examples:
-
-
field: null
message: 'Service Unavailable'
meta:
type: object
properties:
request_id:
type: string
examples:
- 51e25b3b-a569-46f5-b6b5-5047b558e6d2
timestamp:
type: string
examples:
- '2026-08-21T05:14:32.469716Z'
examples:
-
status: ERROR
message: 'Service Unavailable'
data: null
errors:
-
field: null
message: 'Service Unavailable'
meta:
request_id: 51e25b3b-a569-46f5-b6b5-5047b558e6d2
timestamp: '2026-08-21T05:14:32.469716Z'
tags:
- 'Public API'
security: []
parameters:
-
in: path
name: type
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
'/api/v1/public/legal/{documentId}':
get:
summary: 'Show Legal Document'
operationId: showLegalDocument
description: 'Show a specific legal document by ID (public endpoint, no auth required).'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Legal document retrieved.'
data:
type: object
properties:
id:
type: string
examples:
- 019fd2b7-ef68-7312-a1a3-6b14820cf9e2
type:
type: string
examples:
- privacy_policy
title:
type: string
examples:
- Datenschutzerklärung
content:
type: string
examples:
- "# Datenschutzerklärung\n\n**Stand: 05.08.2026**\n**Version: 1.0**\n\n---\n\n## 1. Verantwortlicher\n\n**Flexxer**\nMusterstraße 1\n1010 Wien, Österreich\n\n- **Firmenbuchnummer:** FN 123456x\n- **UID-Nummer:** ATU12345678\n- **Telefon:** +43 1 234 5678\n- **E-Mail:** privacy@flexxr.at\n- **Website:** https://flexxr.at\n\n### 1.1 Datenschutzbeauftragter\n\nFür Fragen zum Datenschutz erreichen Sie unseren Datenschutzbeauftragten unter:\n- **E-Mail:** dpo@flexxr.at\n\n---\n\n## 2. Rechtsgrundlagen der Verarbeitung\n\nWir verarbeiten Ihre personenbezogenen Daten ausschließlich auf Basis der folgenden Rechtsgrundlagen gemäß **Datenschutz-Grundverordnung (DSGVO)** und dem **österreichischen Datenschutzgesetz (DSG)**:\n\n| Rechtsgrundlage | DSGVO Artikel | Anwendungsbereich |\n|-----------------|---------------|-------------------|\n| Vertragserfüllung | Art. 6 Abs. 1 lit. b | Durchführung des Arbeits-/Überlassungsvertrags |\n| Rechtliche Verpflichtung | Art. 6 Abs. 1 lit. c | ASVG-Meldungen, Lohnsteuer, AÜG-Compliance |\n| Berechtigtes Interesse | Art. 6 Abs. 1 lit. f | Betrugsprävention, IT-Sicherheit |\n| Einwilligung | Art. 6 Abs. 1 lit. a | Marketing, optionale Datenverarbeitung |\n\n---\n\n## 3. Kategorien personenbezogener Daten\n\n### 3.1 Stammdaten\n- Vor- und Nachname\n- Geburtsdatum und Geburtsort\n- Staatsangehörigkeit\n- Geschlecht\n- Familienstand\n\n### 3.2 Kontaktdaten\n- E-Mail-Adresse\n- Telefonnummer\n- Wohnadresse\n\n### 3.3 Beschäftigungsdaten\n- Sozialversicherungsnummer (SVNR) gemäß ASVG\n- Steuernummer\n- Bankverbindung (IBAN)\n- Qualifikationen und Zertifikate\n- Arbeitszeitaufzeichnungen\n\n### 3.4 Besondere Kategorien (Art. 9 DSGVO)\n- Gesundheitsdaten (nur bei medizinischen Bescheinigungen)\n- Gewerkschaftszugehörigkeit (nur bei KV-Anwendung)\n\nDiese Daten werden nur mit ausdrücklicher Einwilligung oder aufgrund gesetzlicher Verpflichtung verarbeitet.\n\n---\n\n## 4. Zwecke der Verarbeitung\n\n### 4.1 Vertragserfüllung\n- Durchführung des Arbeitsvertrags gemäß **AÜG § 11**\n- Vermittlung von Arbeitseinsätzen\n- Arbeitszeiterfassung und Abrechnung\n- Lohn- und Gehaltsabrechnung\n\n### 4.2 Gesetzliche Verpflichtungen\n- ELDA-Meldungen an die ÖGK (gemäß **ASVG §§ 33-34**)\n- Lohnsteuerabzug und Meldung an das Finanzamt (**EStG**)\n- Aufbewahrungspflichten (**BAO § 132**: 7 Jahre für Geschäftsunterlagen)\n- AÜG-Meldepflichten an die Gewerbebehörde\n\n### 4.3 Berechtigte Interessen\n- Betrugsprävention und Identitätsprüfung\n- IT-Sicherheit und Systemstabilität\n- Qualitätssicherung und Prozessoptimierung\n\n---\n\n## 5. Empfänger der Daten\n\nIhre Daten werden an folgende Kategorien von Empfängern übermittelt:\n\n| Empfänger | Zweck | Rechtsgrundlage |\n|-----------|-------|-----------------|\n| ÖGK (Österreichische Gesundheitskasse) | Sozialversicherungsmeldungen | ASVG §§ 33-34 |\n| Finanzamt | Lohnsteuer, Lohnzettel | EStG § 84 |\n| Beschäftiger (Kundenunternehmen) | Arbeitseinsatz | AÜG § 12 |\n| Lohnverrechnungsdienstleister | Gehaltsabrechnung | Auftragsverarbeitung |\n| IT-Dienstleister | Hosting, Cloud-Services | Auftragsverarbeitung |\n\n---\n\n## 6. Speicherdauer\n\n| Datenkategorie | Speicherdauer | Rechtsgrundlage |\n|----------------|---------------|-----------------|\n| Lohnabrechnungsunterlagen | 7 Jahre | BAO § 132 |\n| Arbeitszeitaufzeichnungen | 3 Jahre nach Ende des Arbeitsverhältnisses | AZG § 26 |\n| SV-Meldungen | 7 Jahre | ASVG |\n| Bewerbungsunterlagen (bei Ablehnung) | 6 Monate | DSGVO Art. 17 |\n| Vertragsdokumente | 30 Jahre (Verjährungsfrist) | ABGB § 1489 |\n\n---\n\n## 7. Ihre Rechte nach DSGVO\n\nSie haben folgende Rechte bezüglich Ihrer personenbezogenen Daten:\n\n### 7.1 Auskunftsrecht (Art. 15 DSGVO)\nSie haben das Recht, eine Bestätigung darüber zu verlangen, ob personenbezogene Daten verarbeitet werden, und gegebenenfalls Auskunft über diese Daten zu erhalten.\n\n### 7.2 Recht auf Berichtigung (Art. 16 DSGVO)\nSie haben das Recht, unrichtige personenbezogene Daten unverzüglich berichtigen zu lassen.\n\n### 7.3 Recht auf Löschung (Art. 17 DSGVO)\nSie haben das Recht, die Löschung Ihrer Daten zu verlangen, sofern keine gesetzlichen Aufbewahrungspflichten entgegenstehen.\n\n### 7.4 Recht auf Einschränkung (Art. 18 DSGVO)\nSie haben das Recht, die Einschränkung der Verarbeitung zu verlangen.\n\n### 7.5 Recht auf Datenübertragbarkeit (Art. 20 DSGVO)\nSie haben das Recht, Ihre Daten in einem strukturierten, gängigen und maschinenlesbaren Format zu erhalten.\n\n### 7.6 Widerspruchsrecht (Art. 21 DSGVO)\nSie haben das Recht, gegen die Verarbeitung Ihrer Daten Widerspruch einzulegen.\n\n### 7.7 Recht auf Widerruf der Einwilligung (Art. 7 Abs. 3 DSGVO)\nSie haben das Recht, erteilte Einwilligungen jederzeit zu widerrufen.\n\n---\n\n## 8. Beschwerderecht bei der Aufsichtsbehörde\n\nSie haben das Recht, eine Beschwerde bei der zuständigen Aufsichtsbehörde einzureichen:\n\n**Österreichische Datenschutzbehörde**\nBarichgasse 40-42\n1030 Wien\n\n- **E-Mail:** dsb@dsb.gv.at\n- **Website:** https://www.dsb.gv.at\n\n---\n\n## 9. Automatisierte Entscheidungsfindung\n\nEs findet keine automatisierte Entscheidungsfindung im Sinne von **Art. 22 DSGVO** statt, die rechtliche Wirkung entfaltet oder Sie in ähnlicher Weise erheblich beeinträchtigt.\n\n---\n\n## 10. Drittlandübermittlung\n\nEine Übermittlung Ihrer Daten in Drittländer (außerhalb des EWR) erfolgt nur:\n- Auf Basis von Angemessenheitsbeschlüssen der EU-Kommission\n- Unter Verwendung von EU-Standardvertragsklauseln\n- Mit Ihrer ausdrücklichen Einwilligung\n\n---\n\n## 11. Änderungen dieser Datenschutzerklärung\n\nWir behalten uns vor, diese Datenschutzerklärung anzupassen, um sie an geänderte Rechtslagen oder bei Änderungen unserer Dienste anzupassen. Die aktuelle Version finden Sie stets unter: https://flexxr.at/legal/privacy_policy\n\n---\n\n## 12. Kontakt\n\nBei Fragen zum Datenschutz wenden Sie sich bitte an:\n\n**Flexxer**\nMusterstraße 1, 1010 Wien\nE-Mail: privacy@flexxr.at\n"
content_format:
type: string
examples:
- markdown
version:
type: integer
examples:
- 1
locale:
type: string
examples:
- de
published_at:
type: string
examples:
- '2026-08-05T16:18:17+00:00'
effective_until:
type:
- string
- 'null'
examples:
- null
requires_reacceptance:
type: boolean
examples:
- true
content_hash:
type: string
examples:
- 7d28b9a8ddc190e477a58a1d95a0a50d2f0428e19594df2dfff7742c94e784ff
examples:
-
status: SUCCESS
message: 'Legal document retrieved.'
data:
id: 019fd2b7-ef68-7312-a1a3-6b14820cf9e2
type: privacy_policy
title: Datenschutzerklärung
content: "# Datenschutzerklärung\n\n**Stand: 05.08.2026**\n**Version: 1.0**\n\n---\n\n## 1. Verantwortlicher\n\n**Flexxer**\nMusterstraße 1\n1010 Wien, Österreich\n\n- **Firmenbuchnummer:** FN 123456x\n- **UID-Nummer:** ATU12345678\n- **Telefon:** +43 1 234 5678\n- **E-Mail:** privacy@flexxr.at\n- **Website:** https://flexxr.at\n\n### 1.1 Datenschutzbeauftragter\n\nFür Fragen zum Datenschutz erreichen Sie unseren Datenschutzbeauftragten unter:\n- **E-Mail:** dpo@flexxr.at\n\n---\n\n## 2. Rechtsgrundlagen der Verarbeitung\n\nWir verarbeiten Ihre personenbezogenen Daten ausschließlich auf Basis der folgenden Rechtsgrundlagen gemäß **Datenschutz-Grundverordnung (DSGVO)** und dem **österreichischen Datenschutzgesetz (DSG)**:\n\n| Rechtsgrundlage | DSGVO Artikel | Anwendungsbereich |\n|-----------------|---------------|-------------------|\n| Vertragserfüllung | Art. 6 Abs. 1 lit. b | Durchführung des Arbeits-/Überlassungsvertrags |\n| Rechtliche Verpflichtung | Art. 6 Abs. 1 lit. c | ASVG-Meldungen, Lohnsteuer, AÜG-Compliance |\n| Berechtigtes Interesse | Art. 6 Abs. 1 lit. f | Betrugsprävention, IT-Sicherheit |\n| Einwilligung | Art. 6 Abs. 1 lit. a | Marketing, optionale Datenverarbeitung |\n\n---\n\n## 3. Kategorien personenbezogener Daten\n\n### 3.1 Stammdaten\n- Vor- und Nachname\n- Geburtsdatum und Geburtsort\n- Staatsangehörigkeit\n- Geschlecht\n- Familienstand\n\n### 3.2 Kontaktdaten\n- E-Mail-Adresse\n- Telefonnummer\n- Wohnadresse\n\n### 3.3 Beschäftigungsdaten\n- Sozialversicherungsnummer (SVNR) gemäß ASVG\n- Steuernummer\n- Bankverbindung (IBAN)\n- Qualifikationen und Zertifikate\n- Arbeitszeitaufzeichnungen\n\n### 3.4 Besondere Kategorien (Art. 9 DSGVO)\n- Gesundheitsdaten (nur bei medizinischen Bescheinigungen)\n- Gewerkschaftszugehörigkeit (nur bei KV-Anwendung)\n\nDiese Daten werden nur mit ausdrücklicher Einwilligung oder aufgrund gesetzlicher Verpflichtung verarbeitet.\n\n---\n\n## 4. Zwecke der Verarbeitung\n\n### 4.1 Vertragserfüllung\n- Durchführung des Arbeitsvertrags gemäß **AÜG § 11**\n- Vermittlung von Arbeitseinsätzen\n- Arbeitszeiterfassung und Abrechnung\n- Lohn- und Gehaltsabrechnung\n\n### 4.2 Gesetzliche Verpflichtungen\n- ELDA-Meldungen an die ÖGK (gemäß **ASVG §§ 33-34**)\n- Lohnsteuerabzug und Meldung an das Finanzamt (**EStG**)\n- Aufbewahrungspflichten (**BAO § 132**: 7 Jahre für Geschäftsunterlagen)\n- AÜG-Meldepflichten an die Gewerbebehörde\n\n### 4.3 Berechtigte Interessen\n- Betrugsprävention und Identitätsprüfung\n- IT-Sicherheit und Systemstabilität\n- Qualitätssicherung und Prozessoptimierung\n\n---\n\n## 5. Empfänger der Daten\n\nIhre Daten werden an folgende Kategorien von Empfängern übermittelt:\n\n| Empfänger | Zweck | Rechtsgrundlage |\n|-----------|-------|-----------------|\n| ÖGK (Österreichische Gesundheitskasse) | Sozialversicherungsmeldungen | ASVG §§ 33-34 |\n| Finanzamt | Lohnsteuer, Lohnzettel | EStG § 84 |\n| Beschäftiger (Kundenunternehmen) | Arbeitseinsatz | AÜG § 12 |\n| Lohnverrechnungsdienstleister | Gehaltsabrechnung | Auftragsverarbeitung |\n| IT-Dienstleister | Hosting, Cloud-Services | Auftragsverarbeitung |\n\n---\n\n## 6. Speicherdauer\n\n| Datenkategorie | Speicherdauer | Rechtsgrundlage |\n|----------------|---------------|-----------------|\n| Lohnabrechnungsunterlagen | 7 Jahre | BAO § 132 |\n| Arbeitszeitaufzeichnungen | 3 Jahre nach Ende des Arbeitsverhältnisses | AZG § 26 |\n| SV-Meldungen | 7 Jahre | ASVG |\n| Bewerbungsunterlagen (bei Ablehnung) | 6 Monate | DSGVO Art. 17 |\n| Vertragsdokumente | 30 Jahre (Verjährungsfrist) | ABGB § 1489 |\n\n---\n\n## 7. Ihre Rechte nach DSGVO\n\nSie haben folgende Rechte bezüglich Ihrer personenbezogenen Daten:\n\n### 7.1 Auskunftsrecht (Art. 15 DSGVO)\nSie haben das Recht, eine Bestätigung darüber zu verlangen, ob personenbezogene Daten verarbeitet werden, und gegebenenfalls Auskunft über diese Daten zu erhalten.\n\n### 7.2 Recht auf Berichtigung (Art. 16 DSGVO)\nSie haben das Recht, unrichtige personenbezogene Daten unverzüglich berichtigen zu lassen.\n\n### 7.3 Recht auf Löschung (Art. 17 DSGVO)\nSie haben das Recht, die Löschung Ihrer Daten zu verlangen, sofern keine gesetzlichen Aufbewahrungspflichten entgegenstehen.\n\n### 7.4 Recht auf Einschränkung (Art. 18 DSGVO)\nSie haben das Recht, die Einschränkung der Verarbeitung zu verlangen.\n\n### 7.5 Recht auf Datenübertragbarkeit (Art. 20 DSGVO)\nSie haben das Recht, Ihre Daten in einem strukturierten, gängigen und maschinenlesbaren Format zu erhalten.\n\n### 7.6 Widerspruchsrecht (Art. 21 DSGVO)\nSie haben das Recht, gegen die Verarbeitung Ihrer Daten Widerspruch einzulegen.\n\n### 7.7 Recht auf Widerruf der Einwilligung (Art. 7 Abs. 3 DSGVO)\nSie haben das Recht, erteilte Einwilligungen jederzeit zu widerrufen.\n\n---\n\n## 8. Beschwerderecht bei der Aufsichtsbehörde\n\nSie haben das Recht, eine Beschwerde bei der zuständigen Aufsichtsbehörde einzureichen:\n\n**Österreichische Datenschutzbehörde**\nBarichgasse 40-42\n1030 Wien\n\n- **E-Mail:** dsb@dsb.gv.at\n- **Website:** https://www.dsb.gv.at\n\n---\n\n## 9. Automatisierte Entscheidungsfindung\n\nEs findet keine automatisierte Entscheidungsfindung im Sinne von **Art. 22 DSGVO** statt, die rechtliche Wirkung entfaltet oder Sie in ähnlicher Weise erheblich beeinträchtigt.\n\n---\n\n## 10. Drittlandübermittlung\n\nEine Übermittlung Ihrer Daten in Drittländer (außerhalb des EWR) erfolgt nur:\n- Auf Basis von Angemessenheitsbeschlüssen der EU-Kommission\n- Unter Verwendung von EU-Standardvertragsklauseln\n- Mit Ihrer ausdrücklichen Einwilligung\n\n---\n\n## 11. Änderungen dieser Datenschutzerklärung\n\nWir behalten uns vor, diese Datenschutzerklärung anzupassen, um sie an geänderte Rechtslagen oder bei Änderungen unserer Dienste anzupassen. Die aktuelle Version finden Sie stets unter: https://flexxr.at/legal/privacy_policy\n\n---\n\n## 12. Kontakt\n\nBei Fragen zum Datenschutz wenden Sie sich bitte an:\n\n**Flexxer**\nMusterstraße 1, 1010 Wien\nE-Mail: privacy@flexxr.at\n"
content_format: markdown
version: 1
locale: de
published_at: '2026-08-05T16:18:17+00:00'
effective_until: null
requires_reacceptance: true
content_hash: 7d28b9a8ddc190e477a58a1d95a0a50d2f0428e19594df2dfff7742c94e784ff
tags:
- 'Public API'
security: []
parameters:
-
in: path
name: documentId
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
/api/v1/public/privacy-contact:
get:
summary: 'Get Privacy Contact'
operationId: getPrivacyContact
description: 'Controller identity and data-protection contact points (public endpoint).'
parameters: []
responses:
503:
description: ''
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- ERROR
message:
type: string
examples:
- 'Service Unavailable'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type:
- string
- 'null'
examples:
- null
message:
type: string
examples:
- 'Service Unavailable'
examples:
-
-
field: null
message: 'Service Unavailable'
meta:
type: object
properties:
request_id:
type: string
examples:
- 801b4111-2078-4137-a396-974adbf7aed6
timestamp:
type: string
examples:
- '2026-08-21T05:14:32.487770Z'
examples:
-
status: ERROR
message: 'Service Unavailable'
data: null
errors:
-
field: null
message: 'Service Unavailable'
meta:
request_id: 801b4111-2078-4137-a396-974adbf7aed6
timestamp: '2026-08-21T05:14:32.487770Z'
tags:
- 'Public API'
security: []
/api/v1/mobile/home:
get:
summary: 'Get Public Dashboard (Guest Home Screen)'
operationId: getPublicDashboardGuestHomeScreen
description: "Returns the public home screen data for unauthenticated users:\n- Popular jobs this week\n- Recently added jobs\n\nDoes NOT include:\n- Today's shift (requires auth)\n- Profile completion (requires auth)\n- Personalized recommendations (requires auth)"
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
popular_jobs:
type: array
items:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-22cf-71c5-8edd-5e3ce9d29e8b
title:
type: string
examples:
- 'Promoter*in Vienna Marathon'
description:
type: string
examples:
- 'Für ein großes Outdoor-Event suchen wir Promoter*innen und Koordinator*innen. Teamgeist und Flexibilität sind gefragt.'
status:
type: string
examples:
- published
is_featured:
type: boolean
examples:
- false
category:
type: object
properties:
id:
type: string
examples:
- 019fd2b7-f398-7300-a216-c64584fea8f7
slug:
type: string
examples:
- event
name:
type: string
examples:
- Events
name_localized:
type: string
examples:
- Events
icon:
type: string
examples:
- calendar-star
color:
type:
- string
- 'null'
examples:
- null
tags:
type: array
items:
type: string
examples:
-
- Events
- Tagschicht
- Veranstaltungserfahrung
- Teamfähigkeit
organization:
type: object
properties:
id:
type: string
examples:
- 019fd2b7-f072-7154-8961-5b324cc6c46c
name:
type: string
examples:
- Caritas
logo_url:
type:
- string
- 'null'
examples:
- null
average_rating:
type:
- string
- 'null'
examples:
- null
location:
type: object
properties:
name:
type: string
examples:
- 'Promoter*in Vienna Marathon'
address:
type: string
examples:
- 'Hauptstraße 48, 1010 Wien'
city:
type: string
examples:
- Wien
postal_code:
type: string
examples:
- '1010'
lat:
type: number
examples:
- 48.2082
lng:
type: number
examples:
- 16.3738
distance_km:
type:
- string
- 'null'
examples:
- null
schedule:
type: object
properties:
start_date:
type: string
examples:
- '2026-08-26'
end_date:
type: string
examples:
- '2026-08-28'
shift_start_time:
type: string
examples:
- '09:00:00'
shift_end_time:
type: string
examples:
- '17:00:00'
shift_type:
type: string
examples:
- day
shift_type_label:
type: string
examples:
- Tagschicht
duration_hours:
type: integer
examples:
- 8
compensation:
type: object
properties:
hourly_rate_gross:
type: number
examples:
- 13.5
supplements:
type:
- string
- 'null'
examples:
- null
estimated_total_gross:
type:
- string
- 'null'
examples:
- null
currency:
type: string
examples:
- EUR
vacancies:
type: object
properties:
total:
type: integer
examples:
- 20
filled:
type: integer
examples:
- 0
available:
type: integer
examples:
- 20
deadlines:
type: object
properties:
application:
type: string
examples:
- '2026-08-23T00:00:00+00:00'
created_at:
type: string
examples:
- '2026-08-05T16:18:30+00:00'
is_saved:
type: boolean
examples:
- false
can_apply:
type: boolean
examples:
- false
rate:
type:
- string
- 'null'
examples:
- null
wage_hint:
type: string
examples:
- €12-14/hr
examples:
-
-
id: 019fd2b8-22cf-71c5-8edd-5e3ce9d29e8b
title: 'Promoter*in Vienna Marathon'
description: 'Für ein großes Outdoor-Event suchen wir Promoter*innen und Koordinator*innen. Teamgeist und Flexibilität sind gefragt.'
status: published
is_featured: false
category:
id: 019fd2b7-f398-7300-a216-c64584fea8f7
slug: event
name: Events
name_localized: Events
icon: calendar-star
color: null
tags:
- Events
- Tagschicht
- Veranstaltungserfahrung
- Teamfähigkeit
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
logo_url: null
average_rating: null
location:
name: 'Promoter*in Vienna Marathon'
address: 'Hauptstraße 48, 1010 Wien'
city: Wien
postal_code: '1010'
lat: 48.2082
lng: 16.3738
distance_km: null
schedule:
start_date: '2026-08-26'
end_date: '2026-08-28'
shift_start_time: '09:00:00'
shift_end_time: '17:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 13.5
supplements: null
estimated_total_gross: null
currency: EUR
vacancies:
total: 20
filled: 0
available: 20
deadlines:
application: '2026-08-23T00:00:00+00:00'
created_at: '2026-08-05T16:18:30+00:00'
is_saved: false
can_apply: false
rate: null
wage_hint: €12-14/hr
-
id: 019fd2b8-2599-7355-a7f1-dcb185b05faa
title: 'Rezeptionist*in Hotel Sacher'
description: 'Für unser Haus suchen wir freundliche und belastbare Mitarbeiter*innen für den Front- und Back-Office-Bereich.'
status: published
is_featured: false
category:
id: 019fd2b7-f375-724e-84b8-4f9647ef6419
slug: hotel
name: Hotellerie
name_localized: Hospitality
icon: hotel
color: null
tags:
- Hospitality
- Tagschicht
- Hotellerie-Erfahrung
- 'Deutsch B2'
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
logo_url: null
average_rating: null
location:
name: 'Rezeptionist*in Hotel Sacher'
address: 'Hauptstraße 87, 1010 Wien'
city: Wien
postal_code: '1010'
lat: 48.2034
lng: 16.3694
distance_km: null
schedule:
start_date: '2026-08-17'
end_date: '2026-08-19'
shift_start_time: '09:00:00'
shift_end_time: '17:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 17.5
supplements: null
estimated_total_gross: null
currency: EUR
vacancies:
total: 4
filled: 0
available: 4
deadlines:
application: '2026-08-14T00:00:00+00:00'
created_at: '2026-08-05T16:18:31+00:00'
is_saved: false
can_apply: false
rate: null
wage_hint: €14-18/hr
-
id: 019fd2b8-1f86-7376-9a3a-c072ab5675cb
title: 'Service-Mitarbeiter*in Wiener Prater Festival'
description: 'Wir suchen engagierte Service-Mitarbeiter*innen für unser Team. Du bringst Freude am Umgang mit Gästen mit und arbeitest gerne im Team.'
status: published
is_featured: false
category:
id: 019fd2b7-f371-732c-8cdb-6de13be42891
slug: gastro
name: Gastronomie
name_localized: Gastronomy
icon: utensils
color: null
tags:
- Gastronomy
- Tagschicht
- Serviceerfahrung
- 'Deutsch B2'
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
logo_url: null
average_rating: null
location:
name: 'Service-Mitarbeiter*in Wiener Prater Festival'
address: 'Hauptstraße 91, 1020 Wien'
city: Wien
postal_code: '1020'
lat: 48.2117
lng: 16.3969
distance_km: null
schedule:
start_date: '2026-08-19'
end_date: '2026-08-21'
shift_start_time: '09:00:00'
shift_end_time: '17:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 15.5
supplements: null
estimated_total_gross: null
currency: EUR
vacancies:
total: 12
filled: 0
available: 12
deadlines:
application: '2026-08-16T00:00:00+00:00'
created_at: '2026-08-05T16:18:29+00:00'
is_saved: false
can_apply: false
rate: null
wage_hint: €14-18/hr
-
id: 019fd2b8-21c8-72cc-80b1-47fd13450522
title: 'Barkeeper*in Sommernacht Open Air'
description: 'Wir suchen engagierte Service-Mitarbeiter*innen für unser Team. Du bringst Freude am Umgang mit Gästen mit und arbeitest gerne im Team.'
status: published
is_featured: false
category:
id: 019fd2b7-f371-732c-8cdb-6de13be42891
slug: gastro
name: Gastronomie
name_localized: Gastronomy
icon: utensils
color: null
tags:
- Gastronomy
- Nachtschicht
- Serviceerfahrung
- 'Deutsch B2'
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
logo_url: null
average_rating: null
location:
name: 'Barkeeper*in Sommernacht Open Air'
address: 'Hauptstraße 35, 1060 Wien'
city: Wien
postal_code: '1060'
lat: 48.1953
lng: 16.356
distance_km: null
schedule:
start_date: '2026-08-15'
end_date: '2026-08-17'
shift_start_time: '22:00:00'
shift_end_time: '06:00:00'
shift_type: night
shift_type_label: Nachtschicht
duration_hours: 8
compensation:
hourly_rate_gross: 16
supplements: null
estimated_total_gross: null
currency: EUR
vacancies:
total: 8
filled: 0
available: 8
deadlines:
application: '2026-08-12T00:00:00+00:00'
created_at: '2026-08-05T16:18:30+00:00'
is_saved: false
can_apply: false
rate: null
wage_hint: €14-18/hr
-
id: 019fd2b8-24b0-700a-ae2a-142f5e48aead
title: 'Lagerhelfer*in Logistikzentrum Inzersdorf'
description: 'Für unser Logistikzentrum suchen wir zuverlässige Helfer*innen. Körperliche Belastbarkeit und Pünktlichkeit sind Voraussetzung.'
status: published
is_featured: false
category:
id: 019fd2b7-f38b-7209-8b83-b345b172def2
slug: warehouse
name: Lager
name_localized: Warehouse
icon: industry
color: null
tags:
- Warehouse
- Nachtschicht
- 'Staplerführerschein von Vorteil'
- 'Körperliche Belastbarkeit'
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
logo_url: null
average_rating: null
location:
name: 'Lagerhelfer*in Logistikzentrum Inzersdorf'
address: 'Hauptstraße 28, 1230 Wien'
city: Wien
postal_code: '1230'
lat: 48.1454
lng: 16.3499
distance_km: null
schedule:
start_date: '2026-08-12'
end_date: '2026-08-14'
shift_start_time: '22:00:00'
shift_end_time: '06:00:00'
shift_type: night
shift_type_label: Nachtschicht
duration_hours: 8
compensation:
hourly_rate_gross: 14.8
supplements: null
estimated_total_gross: null
currency: EUR
vacancies:
total: 15
filled: 0
available: 15
deadlines:
application: '2026-08-09T00:00:00+00:00'
created_at: '2026-08-05T16:18:31+00:00'
is_saved: false
can_apply: false
rate: null
wage_hint: €14-18/hr
recent_jobs:
type: array
items:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-28c4-732f-a94c-fb5a71a7d682
title:
type: string
examples:
- Accountant
description:
type: string
examples:
- 'Ut nostrum rerum ut alias quia libero excepturi. Voluptatum et aut non quia quisquam molestias. Perferendis qui hic unde.'
status:
type: string
examples:
- active
is_featured:
type: boolean
examples:
- false
category:
type: object
properties:
id:
type: string
examples:
- 019fd2b7-f39f-73e6-870b-fe7584e4f9bc
slug:
type: string
examples:
- office
name:
type: string
examples:
- Büro
name_localized:
type: string
examples:
- Office
icon:
type: string
examples:
- briefcase
color:
type:
- string
- 'null'
examples:
- null
tags:
type: array
items:
type: string
examples:
-
- Office
- Nachtschicht
organization:
type: object
properties:
id:
type: string
examples:
- 019fd2b7-f072-7154-8961-5b324cc6c46c
name:
type: string
examples:
- Caritas
logo_url:
type:
- string
- 'null'
examples:
- null
average_rating:
type:
- string
- 'null'
examples:
- null
location:
type: object
properties:
name:
type: string
examples:
- 'Barrows, Christiansen and Jones'
address:
type: string
examples:
- '586 Tremaine Row'
city:
type: string
examples:
- 'East Eliseo'
postal_code:
type: string
examples:
- 10547-3697
lat:
type: number
examples:
- 46.931383
lng:
type: number
examples:
- 11.998284
distance_km:
type:
- string
- 'null'
examples:
- null
schedule:
type: object
properties:
start_date:
type: string
examples:
- '2026-08-12'
end_date:
type: string
examples:
- '2026-08-19'
shift_start_time:
type: string
examples:
- '01:49:00'
shift_end_time:
type: string
examples:
- '18:57:00'
shift_type:
type: string
examples:
- night
shift_type_label:
type: string
examples:
- Nachtschicht
duration_hours:
type: number
examples:
- 17.133333333333
compensation:
type: object
properties:
hourly_rate_gross:
type: number
examples:
- 32.08
supplements:
type: object
properties:
night:
type: number
examples: [0.7]
weekend:
type: number
examples: [3.86]
estimated_total_gross:
type:
- string
- 'null'
examples:
- null
currency:
type: string
examples:
- EUR
vacancies:
type: object
properties:
total:
type: integer
examples:
- 5
filled:
type: integer
examples:
- 0
available:
type: integer
examples:
- 5
deadlines:
type: object
properties:
application:
type: string
examples:
- '2026-09-05T16:18:32+00:00'
created_at:
type: string
examples:
- '2026-08-05T16:18:32+00:00'
is_saved:
type: boolean
examples:
- false
can_apply:
type: boolean
examples:
- true
rate:
type:
- string
- 'null'
examples:
- null
wage_hint:
type: string
examples:
- €30+/hr
examples:
-
-
id: 019fd2b8-28c4-732f-a94c-fb5a71a7d682
title: Accountant
description: 'Ut nostrum rerum ut alias quia libero excepturi. Voluptatum et aut non quia quisquam molestias. Perferendis qui hic unde.'
status: active
is_featured: false
category:
id: 019fd2b7-f39f-73e6-870b-fe7584e4f9bc
slug: office
name: Büro
name_localized: Office
icon: briefcase
color: null
tags:
- Office
- Nachtschicht
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
logo_url: null
average_rating: null
location:
name: 'Barrows, Christiansen and Jones'
address: '586 Tremaine Row'
city: 'East Eliseo'
postal_code: 10547-3697
lat: 46.931383
lng: 11.998284
distance_km: null
schedule:
start_date: '2026-08-12'
end_date: '2026-08-19'
shift_start_time: '01:49:00'
shift_end_time: '18:57:00'
shift_type: night
shift_type_label: Nachtschicht
duration_hours: 17.133333333333
compensation:
hourly_rate_gross: 32.08
supplements:
night: 0.7
weekend: 3.86
estimated_total_gross: null
currency: EUR
vacancies:
total: 5
filled: 0
available: 5
deadlines:
application: '2026-09-05T16:18:32+00:00'
created_at: '2026-08-05T16:18:32+00:00'
is_saved: false
can_apply: true
rate: null
wage_hint: €30+/hr
-
id: 019fd2b8-1405-709f-bca9-b0a418fb6a75
title: 'Silvesternacht Service'
description: 'Wir suchen motivierte Silvesternacht Service für unser engagiertes Team. Sie unterstützen uns bei der professionellen Gästebetreuung und sorgen für ein unvergessliches Erlebnis. Vorkenntnisse in der Gastronomie sind von Vorteil, aber nicht zwingend erforderlich.'
status: active
is_featured: false
category:
id: 019fd2b7-f371-732c-8cdb-6de13be42891
slug: gastro
name: Gastronomie
name_localized: Gastronomy
icon: utensils
color: null
tags:
- Gastronomy
- Nachtschicht
- 'HACCP Kenntnisse von Vorteil'
organization:
id: 019fd2b7-fe56-70d1-bb3a-641339ce636a
name: 'Lagerhaus Steiermark'
logo_url: null
average_rating: null
location:
name: 'Hotel Imperial Wien'
address: 'Kärntner Ring 16, 1015 Wien'
city: Wien
postal_code: '1010'
lat: 48.2082
lng: 16.3739
distance_km: null
schedule:
start_date: '2027-02-09'
end_date: '2027-02-10'
shift_start_time: '22:00:00'
shift_end_time: '06:00:00'
shift_type: night
shift_type_label: Nachtschicht
duration_hours: 8
compensation:
hourly_rate_gross: 25
supplements:
night_bonus: 50
holiday_bonus: 100
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 12
filled: 0
available: 12
deadlines:
application: '2027-02-04T16:18:26+00:00'
created_at: '2026-08-05T16:18:26+00:00'
is_saved: false
can_apply: true
rate: null
wage_hint: €22-26/hr
-
id: 019fd2b8-15b5-7019-8521-6ea79edc4ba5
title: 'Garderobenservice Ball'
description: 'Für unsere bevorstehende Veranstaltung suchen wir tatkräftige Unterstützung. Als Garderobenservice Ball sind Sie das Aushängeschild unserer Veranstaltung und sorgen für einen reibungslosen Ablauf.'
status: active
is_featured: false
category:
id: 019fd2b7-f398-7300-a216-c64584fea8f7
slug: event
name: Events
name_localized: Events
icon: calendar-star
color: null
tags:
- Events
- Tagschicht
organization:
id: 019fd2b7-ff32-7117-ab28-06e2d3082002
name: 'Bildungszentrum Mitte'
logo_url: null
average_rating: null
location:
name: 'Wiener Rathaus'
address: 'Friedrich-Schmidt-Platz 1, 1010 Wien'
city: Wien
postal_code: '1010'
lat: 48.2082
lng: 16.3739
distance_km: null
schedule:
start_date: '2027-01-22'
end_date: '2027-01-23'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 14.5
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 10
filled: 0
available: 10
deadlines:
application: '2027-01-19T16:18:26+00:00'
created_at: '2026-08-05T16:18:27+00:00'
is_saved: false
can_apply: true
rate: null
wage_hint: €14-18/hr
-
id: 019fd2b8-18d3-718f-bbe2-32c97903f559
title: 'Verkaufshilfe Weihnachtsgeschäft'
description: 'Für unser Retail-Team suchen wir freundliche und kundenorientierte Verkaufshilfe Weihnachtsgeschäft. Sie beraten unsere Kunden, wickeln Kassiervorgänge ab und sorgen für eine ansprechende Warenpräsentation.'
status: active
is_featured: false
category:
id: 019fd2b7-f37d-712d-92b3-aa5540f6b2a7
slug: retail
name: Einzelhandel
name_localized: Retail
icon: shopping-cart
color: null
tags:
- Retail
- Tagschicht
organization:
id: 019fd2b7-fca6-71cf-8683-c97f6f50a24a
name: 'Reinigungsservice Alpin'
logo_url: null
average_rating: null
location:
name: 'Wiener Innenstadt'
address: 'Kärntner Straße 15, 1010 Wien'
city: Wien
postal_code: '1010'
lat: 48.2082
lng: 16.3739
distance_km: null
schedule:
start_date: '2027-01-12'
end_date: '2027-02-01'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 13.5
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 10
filled: 0
available: 10
deadlines:
application: '2027-01-08T16:18:26+00:00'
created_at: '2026-08-05T16:18:28+00:00'
is_saved: false
can_apply: true
rate: null
wage_hint: €12-14/hr
-
id: 019fd2b8-13e2-7390-a987-e12b987cdbb8
title: 'Weihnachtsmarkt Servicekraft'
description: 'Wir suchen motivierte Weihnachtsmarkt Servicekraft für unser engagiertes Team. Sie unterstützen uns bei der professionellen Gästebetreuung und sorgen für ein unvergessliches Erlebnis. Vorkenntnisse in der Gastronomie sind von Vorteil, aber nicht zwingend erforderlich.'
status: active
is_featured: false
category:
id: 019fd2b7-f371-732c-8cdb-6de13be42891
slug: gastro
name: Gastronomie
name_localized: Gastronomy
icon: utensils
color: null
tags:
- Gastronomy
- Tagschicht
- 'HACCP Kenntnisse von Vorteil'
organization:
id: 019fd2b7-f91f-70cb-8409-8632db9df3c7
name: 'Sicherheitsdienst Österreich'
logo_url: null
average_rating: null
location:
name: 'Christkindlmarkt Rathausplatz'
address: 'Rathausplatz 1, 1010 Wien'
city: Wien
postal_code: '1010'
lat: 48.2082
lng: 16.3739
distance_km: null
schedule:
start_date: '2027-01-02'
end_date: '2027-02-01'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 14
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 30
filled: 0
available: 30
deadlines:
application: '2026-12-29T16:18:26+00:00'
created_at: '2026-08-05T16:18:26+00:00'
is_saved: false
can_apply: true
rate: null
wage_hint: €14-18/hr
examples:
-
status: SUCCESS
data:
popular_jobs:
-
id: 019fd2b8-22cf-71c5-8edd-5e3ce9d29e8b
title: 'Promoter*in Vienna Marathon'
description: 'Für ein großes Outdoor-Event suchen wir Promoter*innen und Koordinator*innen. Teamgeist und Flexibilität sind gefragt.'
status: published
is_featured: false
category:
id: 019fd2b7-f398-7300-a216-c64584fea8f7
slug: event
name: Events
name_localized: Events
icon: calendar-star
color: null
tags:
- Events
- Tagschicht
- Veranstaltungserfahrung
- Teamfähigkeit
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
logo_url: null
average_rating: null
location:
name: 'Promoter*in Vienna Marathon'
address: 'Hauptstraße 48, 1010 Wien'
city: Wien
postal_code: '1010'
lat: 48.2082
lng: 16.3738
distance_km: null
schedule:
start_date: '2026-08-26'
end_date: '2026-08-28'
shift_start_time: '09:00:00'
shift_end_time: '17:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 13.5
supplements: null
estimated_total_gross: null
currency: EUR
vacancies:
total: 20
filled: 0
available: 20
deadlines:
application: '2026-08-23T00:00:00+00:00'
created_at: '2026-08-05T16:18:30+00:00'
is_saved: false
can_apply: false
rate: null
wage_hint: €12-14/hr
-
id: 019fd2b8-2599-7355-a7f1-dcb185b05faa
title: 'Rezeptionist*in Hotel Sacher'
description: 'Für unser Haus suchen wir freundliche und belastbare Mitarbeiter*innen für den Front- und Back-Office-Bereich.'
status: published
is_featured: false
category:
id: 019fd2b7-f375-724e-84b8-4f9647ef6419
slug: hotel
name: Hotellerie
name_localized: Hospitality
icon: hotel
color: null
tags:
- Hospitality
- Tagschicht
- Hotellerie-Erfahrung
- 'Deutsch B2'
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
logo_url: null
average_rating: null
location:
name: 'Rezeptionist*in Hotel Sacher'
address: 'Hauptstraße 87, 1010 Wien'
city: Wien
postal_code: '1010'
lat: 48.2034
lng: 16.3694
distance_km: null
schedule:
start_date: '2026-08-17'
end_date: '2026-08-19'
shift_start_time: '09:00:00'
shift_end_time: '17:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 17.5
supplements: null
estimated_total_gross: null
currency: EUR
vacancies:
total: 4
filled: 0
available: 4
deadlines:
application: '2026-08-14T00:00:00+00:00'
created_at: '2026-08-05T16:18:31+00:00'
is_saved: false
can_apply: false
rate: null
wage_hint: €14-18/hr
-
id: 019fd2b8-1f86-7376-9a3a-c072ab5675cb
title: 'Service-Mitarbeiter*in Wiener Prater Festival'
description: 'Wir suchen engagierte Service-Mitarbeiter*innen für unser Team. Du bringst Freude am Umgang mit Gästen mit und arbeitest gerne im Team.'
status: published
is_featured: false
category:
id: 019fd2b7-f371-732c-8cdb-6de13be42891
slug: gastro
name: Gastronomie
name_localized: Gastronomy
icon: utensils
color: null
tags:
- Gastronomy
- Tagschicht
- Serviceerfahrung
- 'Deutsch B2'
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
logo_url: null
average_rating: null
location:
name: 'Service-Mitarbeiter*in Wiener Prater Festival'
address: 'Hauptstraße 91, 1020 Wien'
city: Wien
postal_code: '1020'
lat: 48.2117
lng: 16.3969
distance_km: null
schedule:
start_date: '2026-08-19'
end_date: '2026-08-21'
shift_start_time: '09:00:00'
shift_end_time: '17:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 15.5
supplements: null
estimated_total_gross: null
currency: EUR
vacancies:
total: 12
filled: 0
available: 12
deadlines:
application: '2026-08-16T00:00:00+00:00'
created_at: '2026-08-05T16:18:29+00:00'
is_saved: false
can_apply: false
rate: null
wage_hint: €14-18/hr
-
id: 019fd2b8-21c8-72cc-80b1-47fd13450522
title: 'Barkeeper*in Sommernacht Open Air'
description: 'Wir suchen engagierte Service-Mitarbeiter*innen für unser Team. Du bringst Freude am Umgang mit Gästen mit und arbeitest gerne im Team.'
status: published
is_featured: false
category:
id: 019fd2b7-f371-732c-8cdb-6de13be42891
slug: gastro
name: Gastronomie
name_localized: Gastronomy
icon: utensils
color: null
tags:
- Gastronomy
- Nachtschicht
- Serviceerfahrung
- 'Deutsch B2'
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
logo_url: null
average_rating: null
location:
name: 'Barkeeper*in Sommernacht Open Air'
address: 'Hauptstraße 35, 1060 Wien'
city: Wien
postal_code: '1060'
lat: 48.1953
lng: 16.356
distance_km: null
schedule:
start_date: '2026-08-15'
end_date: '2026-08-17'
shift_start_time: '22:00:00'
shift_end_time: '06:00:00'
shift_type: night
shift_type_label: Nachtschicht
duration_hours: 8
compensation:
hourly_rate_gross: 16
supplements: null
estimated_total_gross: null
currency: EUR
vacancies:
total: 8
filled: 0
available: 8
deadlines:
application: '2026-08-12T00:00:00+00:00'
created_at: '2026-08-05T16:18:30+00:00'
is_saved: false
can_apply: false
rate: null
wage_hint: €14-18/hr
-
id: 019fd2b8-24b0-700a-ae2a-142f5e48aead
title: 'Lagerhelfer*in Logistikzentrum Inzersdorf'
description: 'Für unser Logistikzentrum suchen wir zuverlässige Helfer*innen. Körperliche Belastbarkeit und Pünktlichkeit sind Voraussetzung.'
status: published
is_featured: false
category:
id: 019fd2b7-f38b-7209-8b83-b345b172def2
slug: warehouse
name: Lager
name_localized: Warehouse
icon: industry
color: null
tags:
- Warehouse
- Nachtschicht
- 'Staplerführerschein von Vorteil'
- 'Körperliche Belastbarkeit'
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
logo_url: null
average_rating: null
location:
name: 'Lagerhelfer*in Logistikzentrum Inzersdorf'
address: 'Hauptstraße 28, 1230 Wien'
city: Wien
postal_code: '1230'
lat: 48.1454
lng: 16.3499
distance_km: null
schedule:
start_date: '2026-08-12'
end_date: '2026-08-14'
shift_start_time: '22:00:00'
shift_end_time: '06:00:00'
shift_type: night
shift_type_label: Nachtschicht
duration_hours: 8
compensation:
hourly_rate_gross: 14.8
supplements: null
estimated_total_gross: null
currency: EUR
vacancies:
total: 15
filled: 0
available: 15
deadlines:
application: '2026-08-09T00:00:00+00:00'
created_at: '2026-08-05T16:18:31+00:00'
is_saved: false
can_apply: false
rate: null
wage_hint: €14-18/hr
recent_jobs:
-
id: 019fd2b8-28c4-732f-a94c-fb5a71a7d682
title: Accountant
description: 'Ut nostrum rerum ut alias quia libero excepturi. Voluptatum et aut non quia quisquam molestias. Perferendis qui hic unde.'
status: active
is_featured: false
category:
id: 019fd2b7-f39f-73e6-870b-fe7584e4f9bc
slug: office
name: Büro
name_localized: Office
icon: briefcase
color: null
tags:
- Office
- Nachtschicht
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
logo_url: null
average_rating: null
location:
name: 'Barrows, Christiansen and Jones'
address: '586 Tremaine Row'
city: 'East Eliseo'
postal_code: 10547-3697
lat: 46.931383
lng: 11.998284
distance_km: null
schedule:
start_date: '2026-08-12'
end_date: '2026-08-19'
shift_start_time: '01:49:00'
shift_end_time: '18:57:00'
shift_type: night
shift_type_label: Nachtschicht
duration_hours: 17.133333333333
compensation:
hourly_rate_gross: 32.08
supplements:
night: 0.7
weekend: 3.86
estimated_total_gross: null
currency: EUR
vacancies:
total: 5
filled: 0
available: 5
deadlines:
application: '2026-09-05T16:18:32+00:00'
created_at: '2026-08-05T16:18:32+00:00'
is_saved: false
can_apply: true
rate: null
wage_hint: €30+/hr
-
id: 019fd2b8-1405-709f-bca9-b0a418fb6a75
title: 'Silvesternacht Service'
description: 'Wir suchen motivierte Silvesternacht Service für unser engagiertes Team. Sie unterstützen uns bei der professionellen Gästebetreuung und sorgen für ein unvergessliches Erlebnis. Vorkenntnisse in der Gastronomie sind von Vorteil, aber nicht zwingend erforderlich.'
status: active
is_featured: false
category:
id: 019fd2b7-f371-732c-8cdb-6de13be42891
slug: gastro
name: Gastronomie
name_localized: Gastronomy
icon: utensils
color: null
tags:
- Gastronomy
- Nachtschicht
- 'HACCP Kenntnisse von Vorteil'
organization:
id: 019fd2b7-fe56-70d1-bb3a-641339ce636a
name: 'Lagerhaus Steiermark'
logo_url: null
average_rating: null
location:
name: 'Hotel Imperial Wien'
address: 'Kärntner Ring 16, 1015 Wien'
city: Wien
postal_code: '1010'
lat: 48.2082
lng: 16.3739
distance_km: null
schedule:
start_date: '2027-02-09'
end_date: '2027-02-10'
shift_start_time: '22:00:00'
shift_end_time: '06:00:00'
shift_type: night
shift_type_label: Nachtschicht
duration_hours: 8
compensation:
hourly_rate_gross: 25
supplements:
night_bonus: 50
holiday_bonus: 100
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 12
filled: 0
available: 12
deadlines:
application: '2027-02-04T16:18:26+00:00'
created_at: '2026-08-05T16:18:26+00:00'
is_saved: false
can_apply: true
rate: null
wage_hint: €22-26/hr
-
id: 019fd2b8-15b5-7019-8521-6ea79edc4ba5
title: 'Garderobenservice Ball'
description: 'Für unsere bevorstehende Veranstaltung suchen wir tatkräftige Unterstützung. Als Garderobenservice Ball sind Sie das Aushängeschild unserer Veranstaltung und sorgen für einen reibungslosen Ablauf.'
status: active
is_featured: false
category:
id: 019fd2b7-f398-7300-a216-c64584fea8f7
slug: event
name: Events
name_localized: Events
icon: calendar-star
color: null
tags:
- Events
- Tagschicht
organization:
id: 019fd2b7-ff32-7117-ab28-06e2d3082002
name: 'Bildungszentrum Mitte'
logo_url: null
average_rating: null
location:
name: 'Wiener Rathaus'
address: 'Friedrich-Schmidt-Platz 1, 1010 Wien'
city: Wien
postal_code: '1010'
lat: 48.2082
lng: 16.3739
distance_km: null
schedule:
start_date: '2027-01-22'
end_date: '2027-01-23'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 14.5
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 10
filled: 0
available: 10
deadlines:
application: '2027-01-19T16:18:26+00:00'
created_at: '2026-08-05T16:18:27+00:00'
is_saved: false
can_apply: true
rate: null
wage_hint: €14-18/hr
-
id: 019fd2b8-18d3-718f-bbe2-32c97903f559
title: 'Verkaufshilfe Weihnachtsgeschäft'
description: 'Für unser Retail-Team suchen wir freundliche und kundenorientierte Verkaufshilfe Weihnachtsgeschäft. Sie beraten unsere Kunden, wickeln Kassiervorgänge ab und sorgen für eine ansprechende Warenpräsentation.'
status: active
is_featured: false
category:
id: 019fd2b7-f37d-712d-92b3-aa5540f6b2a7
slug: retail
name: Einzelhandel
name_localized: Retail
icon: shopping-cart
color: null
tags:
- Retail
- Tagschicht
organization:
id: 019fd2b7-fca6-71cf-8683-c97f6f50a24a
name: 'Reinigungsservice Alpin'
logo_url: null
average_rating: null
location:
name: 'Wiener Innenstadt'
address: 'Kärntner Straße 15, 1010 Wien'
city: Wien
postal_code: '1010'
lat: 48.2082
lng: 16.3739
distance_km: null
schedule:
start_date: '2027-01-12'
end_date: '2027-02-01'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 13.5
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 10
filled: 0
available: 10
deadlines:
application: '2027-01-08T16:18:26+00:00'
created_at: '2026-08-05T16:18:28+00:00'
is_saved: false
can_apply: true
rate: null
wage_hint: €12-14/hr
-
id: 019fd2b8-13e2-7390-a987-e12b987cdbb8
title: 'Weihnachtsmarkt Servicekraft'
description: 'Wir suchen motivierte Weihnachtsmarkt Servicekraft für unser engagiertes Team. Sie unterstützen uns bei der professionellen Gästebetreuung und sorgen für ein unvergessliches Erlebnis. Vorkenntnisse in der Gastronomie sind von Vorteil, aber nicht zwingend erforderlich.'
status: active
is_featured: false
category:
id: 019fd2b7-f371-732c-8cdb-6de13be42891
slug: gastro
name: Gastronomie
name_localized: Gastronomy
icon: utensils
color: null
tags:
- Gastronomy
- Tagschicht
- 'HACCP Kenntnisse von Vorteil'
organization:
id: 019fd2b7-f91f-70cb-8409-8632db9df3c7
name: 'Sicherheitsdienst Österreich'
logo_url: null
average_rating: null
location:
name: 'Christkindlmarkt Rathausplatz'
address: 'Rathausplatz 1, 1010 Wien'
city: Wien
postal_code: '1010'
lat: 48.2082
lng: 16.3739
distance_km: null
schedule:
start_date: '2027-01-02'
end_date: '2027-02-01'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 14
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 30
filled: 0
available: 30
deadlines:
application: '2026-12-29T16:18:26+00:00'
created_at: '2026-08-05T16:18:26+00:00'
is_saved: false
can_apply: true
rate: null
wage_hint: €14-18/hr
tags:
- 'Public API'
security: []
/api/v1/public/org/invitations/accept:
post:
summary: 'Accept Invitation'
operationId: acceptInvitation
description: "Phase-1 of the invitation signup flow.\n\nStamps `accepted_at` and `accepted_by_email` on the invitation row,\nthen returns the resolved preset key and label so the front-end can\nrender a confirmation screen before the user completes signup.\n\nThe endpoint is idempotent until `member_created_at` is set: a second\ncall for the same token (e.g. page reload) returns the same 200 body\ninstead of a conflict error."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Invitation accepted.'
data:
type: object
properties:
status:
type: string
examples:
- accepted
preset_key:
type: string
examples:
- viewer
preset_label:
type: string
examples:
- Viewer
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- cb6e38a7-5b78-481e-aa81-9f9501c5c4d0
timestamp:
type: string
examples:
- '2026-08-05T16:19:05.938455Z'
examples:
-
status: SUCCESS
message: 'Invitation accepted.'
data:
status: accepted
preset_key: viewer
preset_label: Viewer
errors: null
meta:
request_id: cb6e38a7-5b78-481e-aa81-9f9501c5c4d0
timestamp: '2026-08-05T16:19:05.938455Z'
410:
description: ''
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- INVITATION_EXPIRED
message:
type: string
examples:
- 'Invitation has expired.'
examples:
-
status: INVITATION_EXPIRED
message: 'Invitation has expired.'
422:
description: ''
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- INVITATION_REVOKED
message:
type: string
examples:
- 'Invitation has been revoked.'
examples:
-
status: INVITATION_REVOKED
message: 'Invitation has been revoked.'
tags:
- 'Public API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
token:
type: string
description: 'The invitation token.'
examples:
- abc123...
accepted_by_email:
type:
- string
- 'null'
description: 'nullable The email used to accept. Defaults to the invitation email.'
examples:
- invitee@example.com
required:
- token
security: []
/api/v1/public/org/invitations/signup:
post:
summary: 'Complete Invitation Signup'
operationId: completeInvitationSignup
description: "Phase-2 of the invitation signup flow.\n\nCreates a User and OrganizationMember record, assigns the ACL preset\nfrom the invitation (with fallbacks for legacy rows), and stamps\nmember_created_at on the invitation.\n\nPreset resolution order:\n 1. invitation.preset_key if non-null and registered in catalog → 'invitation'\n 2. invitation.preset_key is null → role map (PRESET_FOR_LEGACY_ROLE) → 'fallback_legacy_role'\n 3. invitation.preset_key is stale (not in catalog) → 'viewer' → 'fallback_missing_catalog'"
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Account created.'
data:
type: object
properties:
acl:
type: object
properties:
scope:
type: string
examples:
- org-member
presets:
type: array
items:
type: string
examples:
-
- viewer
presets:
type: array
items:
type: string
examples:
-
- viewer
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 8b8ff3cf-05df-49f1-aa0c-aaacc096a0ea
timestamp:
type: string
examples:
- '2026-08-05T16:19:06.535113Z'
examples:
-
status: SUCCESS
message: 'Account created.'
data:
acl:
scope: org-member
presets:
- viewer
presets:
- viewer
errors: null
meta:
request_id: 8b8ff3cf-05df-49f1-aa0c-aaacc096a0ea
timestamp: '2026-08-05T16:19:06.535113Z'
tags:
- 'Public API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
token:
type: string
description: 'The invitation token.'
examples:
- abc123...
name:
type: string
description: 'Full name for the new member account.'
examples:
- 'Jane Doe'
password:
type: string
description: 'Password (min 8 chars).'
examples:
- SecureP4ssword!1
password_confirmation:
type: string
description: 'Must match password.'
examples:
- architecto
required:
- token
- name
- password
- password_confirmation
security: []
/api/v1/mobile/auth/check-email:
post:
summary: 'Check Email Availability'
operationId: checkEmailAvailability
description: 'Checks if an email address is available for registration.'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Email is available.'
data:
type: object
properties:
available:
type: boolean
examples:
- true
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 307c14e3-4d54-46dc-bf54-13557ff1a48a
timestamp:
type: string
examples:
- '2026-08-05T16:18:34.040638Z'
examples:
-
status: SUCCESS
message: 'Email is available.'
data:
available: true
errors: null
meta:
request_id: 307c14e3-4d54-46dc-bf54-13557ff1a48a
timestamp: '2026-08-05T16:18:34.040638Z'
422:
description: 'Validation Error'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- VALIDATION_ERROR
message:
type: string
examples:
- 'The given data was invalid.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type: string
examples:
- email
message:
type: string
examples:
- 'The email field is required.'
examples:
-
-
field: email
message: 'The email field is required.'
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-06-11T12:00:00.000000Z'
examples:
-
status: VALIDATION_ERROR
message: 'The given data was invalid.'
data: null
errors:
-
field: email
message: 'The email field is required.'
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-06-11T12:00:00.000000Z'
tags:
- 'Mobile API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
email:
type: string
description: 'Email address to check.'
examples:
- max@example.com
required:
- email
security: []
/api/v1/mobile/auth/check-phone:
post:
summary: 'Check Phone Availability'
operationId: checkPhoneAvailability
description: 'Checks if a phone number is available for registration.'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Phone number is already registered.'
data:
type: object
properties:
available:
type: boolean
examples:
- false
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- c64348be-986c-4365-8fa5-702eeb4a5699
timestamp:
type: string
examples:
- '2026-08-05T16:18:34.044831Z'
examples:
-
status: SUCCESS
message: 'Phone number is already registered.'
data:
available: false
errors: null
meta:
request_id: c64348be-986c-4365-8fa5-702eeb4a5699
timestamp: '2026-08-05T16:18:34.044831Z'
422:
description: 'Validation Error'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- VALIDATION_ERROR
message:
type: string
examples:
- 'The given data was invalid.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type: string
examples:
- phone_number
message:
type: string
examples:
- 'The phone number field is required.'
examples:
-
-
field: phone_number
message: 'The phone number field is required.'
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-06-11T12:00:00.000000Z'
examples:
-
status: VALIDATION_ERROR
message: 'The given data was invalid.'
data: null
errors:
-
field: phone_number
message: 'The phone number field is required.'
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-06-11T12:00:00.000000Z'
tags:
- 'Mobile API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
country_code:
type: string
description: 'Country code with + prefix.'
examples:
- '+43'
phone_number:
type: string
description: 'Phone number without country code.'
examples:
- '6641234567'
required:
- country_code
- phone_number
security: []
/api/v1/mobile/auth/verify-email/confirm:
post:
summary: 'Confirm Email Verification'
operationId: confirmEmailVerification
description: "Consumes the token from the email verification link. On success the\nuser account is verified and the EmployeeProfile advances to\nprofile_incomplete. An invalid, expired, or already-used token returns\na 410 Gone response so the client can prompt the user to request a new link."
parameters: []
responses:
200:
description: Success
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Email verified successfully.'
data:
type: object
properties:
email:
type: string
examples:
- boris@example.com
status:
type: string
examples:
- profile_incomplete
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-04-02T12:00:00.000000Z'
examples:
-
status: SUCCESS
message: 'Email verified successfully.'
data:
email: boris@example.com
status: profile_incomplete
errors: null
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-04-02T12:00:00.000000Z'
410:
description: 'Token Invalid or Expired'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- VERIFICATION_LINK_EXPIRED
message:
type: string
examples:
- 'Verification link is invalid, expired, or already used. Please request a new one.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type: string
examples:
- token
message:
type: string
examples:
- 'Verification link is invalid, expired, or already used.'
examples:
-
-
field: token
message: 'Verification link is invalid, expired, or already used.'
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-04-02T12:00:00.000000Z'
examples:
-
status: VERIFICATION_LINK_EXPIRED
message: 'Verification link is invalid, expired, or already used. Please request a new one.'
data: null
errors:
-
field: token
message: 'Verification link is invalid, expired, or already used.'
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-04-02T12:00:00.000000Z'
422:
description: 'Validation Error'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- VALIDATION_ERROR
message:
type: string
examples:
- 'The given data was invalid.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type: string
examples:
- token
message:
type: string
examples:
- 'The token field is required.'
examples:
-
-
field: token
message: 'The token field is required.'
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-04-02T12:00:00.000000Z'
examples:
-
status: VALIDATION_ERROR
message: 'The given data was invalid.'
data: null
errors:
-
field: token
message: 'The token field is required.'
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-04-02T12:00:00.000000Z'
tags:
- 'Mobile API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
email:
type: string
description: 'Email address from the verification link.'
examples:
- boris@example.com
token:
type: string
description: 'Verification token from the emailed link.'
examples:
- abc123def456...
required:
- email
- token
security: []
/api/v1/mobile/auth/verify-email/resend:
post:
summary: 'Resend Verification Link'
operationId: resendVerificationLink
description: "Resends the email verification link to the given address. Silently\nsucceeds when the email is not registered or already verified to\nprevent account enumeration."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'If this address has a pending verification, a new link has been sent.'
data:
type: object
properties:
email:
type: string
examples:
- boris@example.com
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 4d862349-74df-4e13-892f-638a1e742726
timestamp:
type: string
examples:
- '2026-08-05T16:18:34.053350Z'
examples:
-
status: SUCCESS
message: 'If this address has a pending verification, a new link has been sent.'
data:
email: boris@example.com
errors: null
meta:
request_id: 4d862349-74df-4e13-892f-638a1e742726
timestamp: '2026-08-05T16:18:34.053350Z'
422:
description: 'Validation Error'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- VALIDATION_ERROR
message:
type: string
examples:
- 'The given data was invalid.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type: string
examples:
- email
message:
type: string
examples:
- 'The email must be a valid email address.'
examples:
-
-
field: email
message: 'The email must be a valid email address.'
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-04-21T19:00:00.000000Z'
examples:
-
status: VALIDATION_ERROR
message: 'The given data was invalid.'
data: null
errors:
-
field: email
message: 'The email must be a valid email address.'
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-04-21T19:00:00.000000Z'
429:
description: 'Rate Limited'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- RATE_LIMITED
message:
type: string
examples:
- 'Too many requests.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type:
- string
- 'null'
examples:
- null
message:
type: string
examples:
- 'Too many requests.'
examples:
-
-
field: null
message: 'Too many requests.'
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-04-21T19:00:00.000000Z'
examples:
-
status: RATE_LIMITED
message: 'Too many requests.'
data: null
errors:
-
field: null
message: 'Too many requests.'
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-04-21T19:00:00.000000Z'
tags:
- 'Mobile API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
email:
type: string
description: 'Email address to resend the link to.'
examples:
- boris@example.com
required:
- email
security: []
/api/v1/mobile/auth/register:
post:
summary: 'Register User'
operationId: registerUser
description: "Creates the user account in REGISTERED status and queues an email\nverification link. Phone (country_code + phone_number) and GDPR\ndocument IDs (terms_document_id, privacy_document_id,\nprocessing_data_document_id) are all required. No session token is\nissued; the user verifies via the emailed link and then signs in."
parameters: []
responses:
201:
description: Success
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- CREATED
message:
type: string
examples:
- 'Registration successful.'
data:
type: object
properties:
employee_id:
type: string
examples:
- usr-uuid
email:
type: string
examples:
- boris@example.com
status:
type: string
examples:
- registered
verification_sent:
type: boolean
examples:
- true
next_step:
type: string
examples:
- email_verification
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-04-02T12:00:00.000000Z'
examples:
-
status: CREATED
message: 'Registration successful.'
data:
employee_id: usr-uuid
email: boris@example.com
status: registered
verification_sent: true
next_step: email_verification
errors: null
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-04-02T12:00:00.000000Z'
409:
description: 'Email Already Registered'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- EMAIL_ALREADY_EXISTS
message:
type: string
examples:
- 'This email is already registered.'
data:
type: object
properties:
can_login:
type: boolean
examples:
- true
can_reset_password:
type: boolean
examples:
- true
errors:
type: array
items:
type: object
properties:
field:
type: string
examples:
- email
message:
type: string
examples:
- 'This email is already registered.'
examples:
-
-
field: email
message: 'This email is already registered.'
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-04-02T12:00:00.000000Z'
examples:
-
status: EMAIL_ALREADY_EXISTS
message: 'This email is already registered.'
data:
can_login: true
can_reset_password: true
errors:
-
field: email
message: 'This email is already registered.'
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-04-02T12:00:00.000000Z'
422:
description: 'Validation Error'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- VALIDATION_ERROR
message:
type: string
examples:
- 'The given data was invalid.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type: string
examples:
- password
message:
type: string
examples:
- 'The password must be at least 8 characters.'
examples:
-
-
field: password
message: 'The password must be at least 8 characters.'
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-04-02T12:00:00.000000Z'
examples:
-
status: VALIDATION_ERROR
message: 'The given data was invalid.'
data: null
errors:
-
field: password
message: 'The password must be at least 8 characters.'
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-04-02T12:00:00.000000Z'
429:
description: 'Rate Limited'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- RATE_LIMIT_EXCEEDED
message:
type: string
examples:
- 'Too many requests.'
data:
type: object
properties:
retry_after:
type: integer
examples:
- 900
errors:
type: array
items:
type: object
properties:
field:
type:
- string
- 'null'
examples:
- null
message:
type: string
examples:
- 'Too many requests.'
examples:
-
-
field: null
message: 'Too many requests.'
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-04-21T19:00:00.000000Z'
examples:
-
status: RATE_LIMIT_EXCEEDED
message: 'Too many requests.'
data:
retry_after: 900
errors:
-
field: null
message: 'Too many requests.'
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-04-21T19:00:00.000000Z'
tags:
- 'Mobile API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
first_name:
type: string
description: 'First name (2-50 chars, letters/spaces/hyphens/apostrophes only).'
examples:
- Boris
last_name:
type: string
description: 'Last name (2-50 chars, letters/spaces/hyphens/apostrophes only).'
examples:
- Jacobi
email:
type: string
description: "User's email address."
examples:
- boris@example.com
country_code:
type: string
description: 'Country calling code (E.164 prefix).'
examples:
- '+43'
phone_number:
type: string
description: 'Phone number digits only.'
examples:
- '6641234567'
password:
type: string
description: 'Password (min 8, max 128, mixed case + numbers + symbols required).'
examples:
- SuperSecret123!
password_confirmation:
type: string
description: 'Password confirmation.'
examples:
- SuperSecret123!
terms_document_id:
type: string
description: 'UUID of Terms of Service version accepted by user (GDPR Art. 7). Providing this ID is the acceptance proof.'
examples:
- 01958e69-a8fe-7000-9abc-123456789abc
privacy_document_id:
type: string
description: 'UUID of Privacy Policy version accepted by user (GDPR Art. 7). Providing this ID is the acceptance proof.'
examples:
- 01958e69-b8fe-7000-9abc-123456789def
processing_data_document_id:
type: string
description: 'UUID of Data Processing Agreement version accepted by user (GDPR Art. 7). Providing this ID is the acceptance proof.'
examples:
- 01958e69-c8fe-7000-9abc-123456789ghi
marketing_consent:
type: boolean
description: 'optional Opt in/out of marketing emails.'
examples:
- false
referral_code:
type:
- string
- 'null'
description: 'optional 8-character alphanumeric referral code.'
examples:
- AB12CD34
language:
type:
- string
- 'null'
description: 'optional Preferred language (de, en, hr). Default: de. Allowed: de, en, hr.'
examples:
- de
device_info:
type:
- object
- 'null'
description: ''
properties:
device_id:
type:
- string
- 'null'
description: 'Must not be greater than 255 characters.'
examples:
- b
platform:
type:
- string
- 'null'
description: 'Must not be greater than 50 characters.'
examples:
- 'n'
os_version:
type:
- string
- 'null'
description: 'Must not be greater than 50 characters.'
examples:
- g
app_version:
type:
- string
- 'null'
description: 'Must not be greater than 50 characters.'
examples:
- z
device_model:
type:
- string
- 'null'
description: 'Must not be greater than 100 characters.'
examples:
- m
examples:
- null
required:
- first_name
- last_name
- email
- country_code
- phone_number
- password
- password_confirmation
- terms_document_id
- privacy_document_id
- processing_data_document_id
security: []
/api/v1/mobile/auth/login:
post:
summary: 'Login User'
operationId: loginUser
description: "Authenticates an end-user against the `user` guard and issues a Sanctum token. If the user has 2FA enabled a limited challenge token is returned and the client must complete the two-factor challenge before accessing any protected endpoints.\n\nSupports login via email or phone number:\n- Email login: email + password\n- Phone login: country_code + phone_number + password"
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Login successful.'
data:
type: object
properties:
token:
type: string
examples:
- 5|1f6S0lbLjAalzY2SdWUu1tdHThVkOGy2vnHx7WdX9e1f8795
refresh_token:
type: string
examples:
- 6|IZHjJiYI6X4IOrBpe0wRa0MXGE1sdBHywaUzaQDMcf7756ed
expires_in:
type: integer
examples:
- 604800
user:
type: object
properties:
id:
type: string
examples:
- 019fd2b7-f271-73fd-8268-848be381e136
first_name:
type: string
examples:
- Anna
last_name:
type: string
examples:
- Neuling
email:
type: string
examples:
- pending@demo.flexxr.at
country_code:
type: string
examples:
- '+43'
phone_number:
type: string
examples:
- '6769876543'
status:
type: string
examples:
- active
avatar_url:
type:
- string
- 'null'
examples:
- null
bio:
type:
- string
- 'null'
examples:
- null
date_of_birth:
type:
- string
- 'null'
examples:
- null
country:
type:
- string
- 'null'
examples:
- null
city:
type:
- string
- 'null'
examples:
- null
notify_push:
type: boolean
examples:
- true
notify_email:
type: boolean
examples:
- true
notify_sms:
type: boolean
examples:
- true
notify_marketing:
type: boolean
examples:
- false
email_verified_at:
type: string
examples:
- '2026-08-05T16:18:32+00:00'
phone_verified_at:
type: string
examples:
- '2026-08-05T16:18:32+00:00'
created_at:
type: string
examples:
- '2026-08-05T16:18:18+00:00'
updated_at:
type: string
examples:
- '2026-08-05T16:18:34+00:00'
employee_profile:
type: object
properties:
address_line_1:
type: string
examples:
- 'Neugasse 5'
address_line_2:
type:
- string
- 'null'
examples:
- null
postal_code:
type: string
examples:
- '4020'
employee_status:
type: string
examples:
- active
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- db53cffc-fb25-412c-8049-67967cc3b0d8
timestamp:
type: string
examples:
- '2026-08-05T16:18:34.317645Z'
examples:
-
status: SUCCESS
message: 'Login successful.'
data:
token: 5|1f6S0lbLjAalzY2SdWUu1tdHThVkOGy2vnHx7WdX9e1f8795
refresh_token: 6|IZHjJiYI6X4IOrBpe0wRa0MXGE1sdBHywaUzaQDMcf7756ed
expires_in: 604800
user:
id: 019fd2b7-f271-73fd-8268-848be381e136
first_name: Anna
last_name: Neuling
email: pending@demo.flexxr.at
country_code: '+43'
phone_number: '6769876543'
status: active
avatar_url: null
bio: null
date_of_birth: null
country: null
city: null
notify_push: true
notify_email: true
notify_sms: true
notify_marketing: false
email_verified_at: '2026-08-05T16:18:32+00:00'
phone_verified_at: '2026-08-05T16:18:32+00:00'
created_at: '2026-08-05T16:18:18+00:00'
updated_at: '2026-08-05T16:18:34+00:00'
employee_profile:
address_line_1: 'Neugasse 5'
address_line_2: null
postal_code: '4020'
employee_status: active
errors: null
meta:
request_id: db53cffc-fb25-412c-8049-67967cc3b0d8
timestamp: '2026-08-05T16:18:34.317645Z'
401:
description: ''
content:
application/json:
schema:
oneOf:
-
description: '2FA Required'
type: object
properties:
status:
type: string
examples:
- TWO_FACTOR_REQUIRED
message:
type: string
examples:
- 'Two-factor authentication is required.'
data:
type: object
properties:
token:
type: string
examples:
- 2|challenge-token...
two_factor_method:
type: string
examples:
- totp
errors:
type: array
items:
type: object
properties:
field:
type:
- string
- 'null'
examples:
- null
message:
type: string
examples:
- 'Two-factor authentication is required.'
examples:
-
-
field: null
message: 'Two-factor authentication is required.'
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-04-02T12:00:00.000000Z'
examples:
-
status: TWO_FACTOR_REQUIRED
message: 'Two-factor authentication is required.'
data:
token: 2|challenge-token...
two_factor_method: totp
errors:
-
field: null
message: 'Two-factor authentication is required.'
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-04-02T12:00:00.000000Z'
-
description: 'Invalid Credentials'
type: object
properties:
status:
type: string
examples:
- INVALID_CREDENTIALS
message:
type: string
examples:
- 'The provided credentials are incorrect.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type: string
examples:
- email
message:
type: string
examples:
- 'The provided credentials are incorrect.'
examples:
-
-
field: email
message: 'The provided credentials are incorrect.'
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-04-02T12:00:00.000000Z'
examples:
-
status: INVALID_CREDENTIALS
message: 'The provided credentials are incorrect.'
data: null
errors:
-
field: email
message: 'The provided credentials are incorrect.'
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-04-02T12:00:00.000000Z'
-
description: 'Invalid Credentials with CAPTCHA'
type: object
properties:
status:
type: string
examples:
- INVALID_CREDENTIALS
message:
type: string
examples:
- 'The provided credentials are incorrect.'
data:
type: object
properties:
captcha_required:
type: boolean
examples:
- true
errors:
type: array
items:
type: object
properties:
field:
type: string
examples:
- email
message:
type: string
examples:
- 'The provided credentials are incorrect.'
examples:
-
-
field: email
message: 'The provided credentials are incorrect.'
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-04-02T12:00:00.000000Z'
examples:
-
status: INVALID_CREDENTIALS
message: 'The provided credentials are incorrect.'
data:
captcha_required: true
errors:
-
field: email
message: 'The provided credentials are incorrect.'
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-04-02T12:00:00.000000Z'
-
description: 'Account Deactivated'
type: object
properties:
status:
type: string
examples:
- ACCOUNT_DEACTIVATED
message:
type: string
examples:
- 'Your account has been deactivated.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type: string
examples:
- email
message:
type: string
examples:
- 'Your account has been deactivated.'
examples:
-
-
field: email
message: 'Your account has been deactivated.'
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-04-02T12:00:00.000000Z'
examples:
-
status: ACCOUNT_DEACTIVATED
message: 'Your account has been deactivated.'
data: null
errors:
-
field: email
message: 'Your account has been deactivated.'
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-04-02T12:00:00.000000Z'
403:
description: 'Account Banned'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- ACCOUNT_BANNED
message:
type: string
examples:
- 'Your account has been banned.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type: string
examples:
- email
message:
type: string
examples:
- 'Your account has been banned.'
examples:
-
-
field: email
message: 'Your account has been banned.'
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-04-02T12:00:00.000000Z'
examples:
-
status: ACCOUNT_BANNED
message: 'Your account has been banned.'
data: null
errors:
-
field: email
message: 'Your account has been banned.'
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-04-02T12:00:00.000000Z'
422:
description: 'Validation Error'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- VALIDATION_ERROR
message:
type: string
examples:
- 'The given data was invalid.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type: string
examples:
- email
message:
type: string
examples:
- 'The email field is required.'
examples:
-
-
field: email
message: 'The email field is required.'
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-04-02T12:00:00.000000Z'
examples:
-
status: VALIDATION_ERROR
message: 'The given data was invalid.'
data: null
errors:
-
field: email
message: 'The email field is required.'
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-04-02T12:00:00.000000Z'
423:
description: ''
content:
application/json:
schema:
oneOf:
-
description: 'Account Temporarily Locked'
type: object
properties:
status:
type: string
examples:
- ACCOUNT_TEMPORARILY_LOCKED
message:
type: string
examples:
- 'Account temporarily locked. Try again in 15 minutes.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type: string
examples:
- email
message:
type: string
examples:
- 'Account temporarily locked. Try again in 15 minutes.'
examples:
-
-
field: email
message: 'Account temporarily locked. Try again in 15 minutes.'
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-04-02T12:00:00.000000Z'
examples:
-
status: ACCOUNT_TEMPORARILY_LOCKED
message: 'Account temporarily locked. Try again in 15 minutes.'
data: null
errors:
-
field: email
message: 'Account temporarily locked. Try again in 15 minutes.'
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-04-02T12:00:00.000000Z'
-
description: 'Account Locked for Review'
type: object
properties:
status:
type: string
examples:
- ACCOUNT_LOCKED_FOR_REVIEW
message:
type: string
examples:
- 'Account locked pending admin review.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type: string
examples:
- email
message:
type: string
examples:
- 'Account locked pending admin review.'
examples:
-
-
field: email
message: 'Account locked pending admin review.'
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-04-02T12:00:00.000000Z'
examples:
-
status: ACCOUNT_LOCKED_FOR_REVIEW
message: 'Account locked pending admin review.'
data: null
errors:
-
field: email
message: 'Account locked pending admin review.'
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-04-02T12:00:00.000000Z'
429:
description: 'Rate Limited'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- RATE_LIMITED
message:
type: string
examples:
- 'Too many requests.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type:
- string
- 'null'
examples:
- null
message:
type: string
examples:
- 'Too many requests.'
examples:
-
-
field: null
message: 'Too many requests.'
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-04-21T19:00:00.000000Z'
examples:
-
status: RATE_LIMITED
message: 'Too many requests.'
data: null
errors:
-
field: null
message: 'Too many requests.'
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-04-21T19:00:00.000000Z'
tags:
- 'Mobile API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
email:
type:
- string
- 'null'
description: "User's email address (required if not using phone login)."
examples:
- boris@example.com
country_code:
type:
- string
- 'null'
description: 'Country code with + prefix (required for phone login).'
examples:
- '+43'
phone_number:
type:
- string
- 'null'
description: 'Phone number without country code (required for phone login).'
examples:
- '6641234567'
password:
type: string
description: 'Plain-text password (min 8 characters).'
examples:
- SuperSecret123!
code:
type:
- string
- 'null'
description: 'Optional 2FA one-time code (TOTP from authenticator app, or email OTP from a prior login attempt). When supplied together with credentials, the server completes the login in a single request — no separate challenge call needed.'
examples:
- '123456'
recovery_code:
type:
- string
- 'null'
description: 'Optional 2FA recovery code used in place of `code` when the authenticator device is unavailable.'
examples:
- ABCD-1234-EFGH
remember_me:
type: boolean
description: 'Optional. When true, the issued refresh token is valid for 30 days instead of 7.'
examples:
- false
required:
- password
security: []
/api/v1/mobile/auth/social-login:
post:
summary: 'Social Login'
operationId: socialLogin
description: 'Handles social login (Google / Apple) via Firebase ID token verification. On success returns a Sanctum token; if the linked user has 2FA enabled a limited challenge token is returned instead and the client must complete the 2FA challenge. Brand-new social users who have not yet recorded TERMS and PRIVACY consent receive a limited supplementary token and must call POST /auth/social/complete before accessing the feature surface.'
parameters: []
responses:
200:
description: ''
content:
application/json:
schema:
oneOf:
-
description: Success
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Login successful.'
data:
type: object
properties:
requires_supplementary:
type: boolean
examples:
- false
token:
type: string
examples:
- 1|abcdef123456...
refresh_token:
type: string
examples:
- 2|refreshtoken...
expires_in:
type: integer
examples:
- 900
user:
type: object
properties:
id:
type: string
examples:
- usr-uuid
first_name:
type: string
examples:
- Max
last_name:
type: string
examples:
- Mustermann
email:
type: string
examples:
- max@example.com
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-06-12T12:00:00.000000Z'
examples:
-
status: SUCCESS
message: 'Login successful.'
data:
requires_supplementary: false
token: 1|abcdef123456...
refresh_token: 2|refreshtoken...
expires_in: 900
user:
id: usr-uuid
first_name: Max
last_name: Mustermann
email: max@example.com
errors: null
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-06-12T12:00:00.000000Z'
-
description: 'Supplementary Required'
type: object
properties:
status:
type: string
examples:
- SOCIAL_SUPPLEMENTARY_REQUIRED
message:
type: string
examples:
- 'Please complete registration to continue.'
data:
type: object
properties:
requires_supplementary:
type: boolean
examples:
- true
token:
type: string
examples:
- 1|limited-token...
missing:
type: array
items:
type: string
examples:
-
- last_name
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-06-12T12:00:00.000000Z'
examples:
-
status: SOCIAL_SUPPLEMENTARY_REQUIRED
message: 'Please complete registration to continue.'
data:
requires_supplementary: true
token: 1|limited-token...
missing:
- last_name
errors: null
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-06-12T12:00:00.000000Z'
401:
description: ''
content:
application/json:
schema:
oneOf:
-
description: '2FA Required'
type: object
properties:
status:
type: string
examples:
- TWO_FACTOR_REQUIRED
message:
type: string
examples:
- 'Two-factor authentication is required.'
data:
type: object
properties:
token:
type: string
examples:
- 2|challenge-token...
two_factor_method:
type: string
examples:
- totp
errors:
type: array
items:
type: object
properties:
field:
type:
- string
- 'null'
examples:
- null
message:
type: string
examples:
- 'Two-factor authentication is required.'
examples:
-
-
field: null
message: 'Two-factor authentication is required.'
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-06-12T12:00:00.000000Z'
examples:
-
status: TWO_FACTOR_REQUIRED
message: 'Two-factor authentication is required.'
data:
token: 2|challenge-token...
two_factor_method: totp
errors:
-
field: null
message: 'Two-factor authentication is required.'
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-06-12T12:00:00.000000Z'
-
description: 'Invalid Token'
type: object
properties:
status:
type: string
examples:
- FIREBASE_TOKEN_INVALID
message:
type: string
examples:
- 'The Firebase ID token is invalid or has expired.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type:
- string
- 'null'
examples:
- null
message:
type: string
examples:
- 'The Firebase ID token is invalid or has expired.'
examples:
-
-
field: null
message: 'The Firebase ID token is invalid or has expired.'
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-06-12T12:00:00.000000Z'
examples:
-
status: FIREBASE_TOKEN_INVALID
message: 'The Firebase ID token is invalid or has expired.'
data: null
errors:
-
field: null
message: 'The Firebase ID token is invalid or has expired.'
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-06-12T12:00:00.000000Z'
-
description: 'Account Deactivated'
type: object
properties:
status:
type: string
examples:
- ACCOUNT_DEACTIVATED
message:
type: string
examples:
- 'Your account has been deactivated.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type: string
examples:
- email
message:
type: string
examples:
- 'Your account has been deactivated.'
examples:
-
-
field: email
message: 'Your account has been deactivated.'
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-06-12T12:00:00.000000Z'
examples:
-
status: ACCOUNT_DEACTIVATED
message: 'Your account has been deactivated.'
data: null
errors:
-
field: email
message: 'Your account has been deactivated.'
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-06-12T12:00:00.000000Z'
403:
description: 'Account Banned'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- ACCOUNT_BANNED
message:
type: string
examples:
- 'Your account has been banned.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type: string
examples:
- email
message:
type: string
examples:
- 'Your account has been banned.'
examples:
-
-
field: email
message: 'Your account has been banned.'
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-06-12T12:00:00.000000Z'
examples:
-
status: ACCOUNT_BANNED
message: 'Your account has been banned.'
data: null
errors:
-
field: email
message: 'Your account has been banned.'
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-06-12T12:00:00.000000Z'
422:
description: 'Validation Error'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- VALIDATION_ERROR
message:
type: string
examples:
- 'The given data was invalid.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type: string
examples:
- firebase_token
message:
type: string
examples:
- 'The firebase token field is required.'
examples:
-
-
field: firebase_token
message: 'The firebase token field is required.'
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-06-12T12:00:00.000000Z'
examples:
-
status: VALIDATION_ERROR
message: 'The given data was invalid.'
data: null
errors:
-
field: firebase_token
message: 'The firebase token field is required.'
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-06-12T12:00:00.000000Z'
429:
description: 'Rate Limited'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- RATE_LIMITED
message:
type: string
examples:
- 'Too many requests.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type:
- string
- 'null'
examples:
- null
message:
type: string
examples:
- 'Too many requests.'
examples:
-
-
field: null
message: 'Too many requests.'
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-06-12T12:00:00.000000Z'
examples:
-
status: RATE_LIMITED
message: 'Too many requests.'
data: null
errors:
-
field: null
message: 'Too many requests.'
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-06-12T12:00:00.000000Z'
tags:
- 'Mobile API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
firebase_token:
type: string
description: 'Firebase ID token from sign-in provider.'
examples:
- eyJhbGciOiJSUzI1NiIsImtpZCI6IjEyMzQ1Njc4OTAifQ...
provider:
type: string
description: 'Social provider ("google" or "apple"). Allowed: google, apple.'
examples:
- google
code:
type:
- string
- 'null'
description: 'Optional 2FA one-time code (TOTP or email OTP) for single-step social + 2FA login. When supplied, the server completes authentication in one request — no separate challenge call.'
examples:
- '123456'
recovery_code:
type:
- string
- 'null'
description: 'Optional 2FA recovery code in place of `code`.'
examples:
- ABCD-1234-EFGH
required:
- firebase_token
- provider
security: []
/api/v1/mobile/auth/refresh:
post:
summary: 'Refresh Token'
operationId: refreshToken
description: "Rotates the caller's refresh token. The presented refresh token is deleted\nand a new access + refresh token pair is returned. This endpoint does NOT\nrequire 2FA verification — the refresh token itself is the credential."
parameters: []
responses:
200:
description: Success
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Token refreshed.'
data:
type: object
properties:
token:
type: string
examples:
- 3|newaccess...
refresh_token:
type: string
examples:
- 4|newrefresh...
expires_in:
type: integer
examples:
- 900
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties: { }
examples:
-
status: SUCCESS
message: 'Token refreshed.'
data:
token: 3|newaccess...
refresh_token: 4|newrefresh...
expires_in: 900
errors: null
meta: { }
401:
description: 'Not a refresh token'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- UNAUTHORIZED
message:
type: string
examples:
- 'Invalid refresh token.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type:
- string
- 'null'
examples:
- null
message:
type: string
examples:
- 'Invalid refresh token.'
examples:
-
-
field: null
message: 'Invalid refresh token.'
meta:
type: object
properties: { }
examples:
-
status: UNAUTHORIZED
message: 'Invalid refresh token.'
data: null
errors:
-
field: null
message: 'Invalid refresh token.'
meta: { }
tags:
- 'Mobile API'
/api/v1/mobile/auth/social/complete:
post:
summary: 'Complete Social Registration'
operationId: completeSocialRegistration
description: "Finalises consent capture and profile data for a social-login user who\nreceived requires_supplementary = true. Requires the limited\nsocial-supplementary token issued by POST /auth/social-login."
parameters: []
responses:
200:
description: Success
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Registration completed.'
data:
type: object
properties:
token:
type: string
examples:
- 1|abcdef123456...
refresh_token:
type: string
examples:
- 2|refreshtoken...
expires_in:
type: integer
examples:
- 900
user:
type: object
properties:
id:
type: string
examples:
- usr-uuid
first_name:
type: string
examples:
- Max
last_name:
type: string
examples:
- Mustermann
email:
type: string
examples:
- max@example.com
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-06-12T12:00:00.000000Z'
examples:
-
status: SUCCESS
message: 'Registration completed.'
data:
token: 1|abcdef123456...
refresh_token: 2|refreshtoken...
expires_in: 900
user:
id: usr-uuid
first_name: Max
last_name: Mustermann
email: max@example.com
errors: null
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-06-12T12:00:00.000000Z'
403:
description: 'Wrong token ability'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- FORBIDDEN
message:
type: string
examples:
- 'This action requires a social-supplementary token.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type:
- string
- 'null'
examples:
- null
message:
type: string
examples:
- 'This action requires a social-supplementary token.'
examples:
-
-
field: null
message: 'This action requires a social-supplementary token.'
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-06-12T12:00:00.000000Z'
examples:
-
status: FORBIDDEN
message: 'This action requires a social-supplementary token.'
data: null
errors:
-
field: null
message: 'This action requires a social-supplementary token.'
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-06-12T12:00:00.000000Z'
422:
description: 'Validation Error'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- VALIDATION_ERROR
message:
type: string
examples:
- 'The given data was invalid.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type: string
examples:
- terms_document_id
message:
type: string
examples:
- 'The terms document id field is required.'
examples:
-
-
field: terms_document_id
message: 'The terms document id field is required.'
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-06-12T12:00:00.000000Z'
examples:
-
status: VALIDATION_ERROR
message: 'The given data was invalid.'
data: null
errors:
-
field: terms_document_id
message: 'The terms document id field is required.'
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-06-12T12:00:00.000000Z'
tags:
- 'Mobile API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
terms_document_id:
type: string
description: 'UUID of Terms version user accepted. Providing this ID IS the acceptance proof.'
examples:
- 550e8400-e29b-41d4-a716-446655440000
privacy_document_id:
type: string
description: 'UUID of Privacy Policy version user accepted. Providing this ID IS the acceptance proof.'
examples:
- 550e8400-e29b-41d4-a716-446655440001
processing_data_document_id:
type: string
description: 'UUID of Data Processing Consent version user accepted. Providing this ID IS the acceptance proof.'
examples:
- 550e8400-e29b-41d4-a716-446655440002
marketing_consent:
type: boolean
description: 'optional Whether to opt in to marketing emails.'
examples:
- false
first_name:
type:
- string
- 'null'
description: "optional Fills the user's first name when empty."
examples:
- Max
last_name:
type:
- string
- 'null'
description: "optional Fills the user's last name when empty."
examples:
- Mustermann
language:
type:
- string
- 'null'
description: 'optional Preferred language (de, en, hr). Allowed: de, en, hr.'
examples:
- de
device_info:
type:
- object
- 'null'
description: 'optional Device metadata stored in consent audit trail.'
properties:
platform:
type: string
description: 'optional Device platform.'
examples:
- ios
version:
type: string
description: 'optional Platform version.'
examples:
- '17.0'
examples:
- []
required:
- terms_document_id
- privacy_document_id
- processing_data_document_id
/api/v1/mobile/auth/verify-phone:
post:
summary: 'Verify Phone via Firebase'
operationId: verifyPhoneViaFirebase
description: "Verifies a phone number using a Firebase ID token. The mobile app uses Firebase Phone Auth\nto verify the user's phone number, then sends the Firebase ID token to this endpoint."
parameters: []
responses:
200:
description: Success
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Phone number verified successfully.'
data:
type: object
properties:
phone_verified_at:
type: string
examples:
- '2026-06-11T12:00:00.000000Z'
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-06-11T12:00:00.000000Z'
examples:
-
status: SUCCESS
message: 'Phone number verified successfully.'
data:
phone_verified_at: '2026-06-11T12:00:00.000000Z'
errors: null
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-06-11T12:00:00.000000Z'
400:
description: 'Phone Mismatch'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- ERROR
message:
type: string
examples:
- 'Phone number does not match.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type: string
examples:
- firebase_id_token
message:
type: string
examples:
- 'Phone number from Firebase does not match user profile.'
examples:
-
-
field: firebase_id_token
message: 'Phone number from Firebase does not match user profile.'
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-06-11T12:00:00.000000Z'
examples:
-
status: ERROR
message: 'Phone number does not match.'
data: null
errors:
-
field: firebase_id_token
message: 'Phone number from Firebase does not match user profile.'
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-06-11T12:00:00.000000Z'
401:
description: 'Invalid Token'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- FIREBASE_TOKEN_INVALID
message:
type: string
examples:
- 'The Firebase ID token is invalid or has expired.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-06-11T12:00:00.000000Z'
examples:
-
status: FIREBASE_TOKEN_INVALID
message: 'The Firebase ID token is invalid or has expired.'
data: null
errors: null
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-06-11T12:00:00.000000Z'
409:
description: 'Phone Already Verified'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- ERROR
message:
type: string
examples:
- 'Phone number is already verified.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type: string
examples:
- firebase_id_token
message:
type: string
examples:
- 'Phone number is already verified.'
examples:
-
-
field: firebase_id_token
message: 'Phone number is already verified.'
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-06-11T12:00:00.000000Z'
examples:
-
status: ERROR
message: 'Phone number is already verified.'
data: null
errors:
-
field: firebase_id_token
message: 'Phone number is already verified.'
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-06-11T12:00:00.000000Z'
tags:
- 'Mobile API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
firebase_id_token:
type: string
description: 'The Firebase ID token from phone auth.'
examples:
- eyJhbGciOiJSUzI1NiIs...
required:
- firebase_id_token
/api/v1/mobile/profile:
get:
summary: 'Get User Profile'
operationId: getUserProfile
description: "Returns the authenticated user's account profile including personal info,\ncontact details, and two-factor authentication status."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- Success
data:
type: object
properties:
id:
type: string
examples:
- 019fd2b7-f271-73fd-8268-848be381e136
first_name:
type: string
examples:
- Anna
last_name:
type: string
examples:
- Neuling
email:
type: string
examples:
- pending@demo.flexxr.at
country_code:
type: string
examples:
- '+43'
phone_number:
type: string
examples:
- '6769876543'
status:
type: string
examples:
- active
avatar_url:
type:
- string
- 'null'
examples:
- null
bio:
type:
- string
- 'null'
examples:
- null
date_of_birth:
type:
- string
- 'null'
examples:
- null
country:
type:
- string
- 'null'
examples:
- null
city:
type:
- string
- 'null'
examples:
- null
notify_push:
type: boolean
examples:
- true
notify_email:
type: boolean
examples:
- true
notify_sms:
type: boolean
examples:
- true
notify_marketing:
type: boolean
examples:
- false
email_verified_at:
type: string
examples:
- '2026-08-05T16:18:32+00:00'
phone_verified_at:
type: string
examples:
- '2026-08-05T16:18:32+00:00'
created_at:
type: string
examples:
- '2026-08-05T16:18:18+00:00'
updated_at:
type: string
examples:
- '2026-08-05T16:18:33+00:00'
employee_profile:
type:
- string
- 'null'
examples:
- null
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 930c5193-62e0-4ecd-953f-e1066486631b
timestamp:
type: string
examples:
- '2026-08-05T16:18:34.713826Z'
examples:
-
status: SUCCESS
message: Success
data:
id: 019fd2b7-f271-73fd-8268-848be381e136
first_name: Anna
last_name: Neuling
email: pending@demo.flexxr.at
country_code: '+43'
phone_number: '6769876543'
status: active
avatar_url: null
bio: null
date_of_birth: null
country: null
city: null
notify_push: true
notify_email: true
notify_sms: true
notify_marketing: false
email_verified_at: '2026-08-05T16:18:32+00:00'
phone_verified_at: '2026-08-05T16:18:32+00:00'
created_at: '2026-08-05T16:18:18+00:00'
updated_at: '2026-08-05T16:18:33+00:00'
employee_profile: null
errors: null
meta:
request_id: 930c5193-62e0-4ecd-953f-e1066486631b
timestamp: '2026-08-05T16:18:34.713826Z'
tags:
- 'Mobile API'
/api/v1/mobile/profile/password:
put:
summary: 'Change User Password'
operationId: changeUserPassword
description: "Changes the authenticated user's password."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Password changed successfully.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 3f784394-7936-45b9-9fb2-0f9bc3e527cb
timestamp:
type: string
examples:
- '2026-08-05T16:18:35.373354Z'
examples:
-
status: SUCCESS
message: 'Password changed successfully.'
data: null
errors: null
meta:
request_id: 3f784394-7936-45b9-9fb2-0f9bc3e527cb
timestamp: '2026-08-05T16:18:35.373354Z'
tags:
- 'Mobile API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
current_password:
type: string
description: ''
examples:
- S3cure-Passw0rd!
password:
type: string
description: ''
examples:
- S3cure-Passw0rd!
logout_other_devices:
type: boolean
description: 'nullable Revoke all other active sessions if true.'
examples:
- true
required:
- current_password
- password
/api/v1/mobile/profile/photo:
post:
summary: 'Upload Profile Photo'
operationId: uploadProfilePhoto
description: "Upload (or replace) the authenticated worker's profile photo."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Your profile photo has been updated.'
data:
type: object
properties:
avatar_url:
type: string
examples:
- /storage/avatars/employees/BlRaQOE7e1f5iXoxW40ek9H2IYGSe998YjY9LItd.jpg
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- c3d2c124-78c4-49c6-beac-5278c8e18aed
timestamp:
type: string
examples:
- '2026-08-05T16:18:35.399573Z'
examples:
-
status: SUCCESS
message: 'Your profile photo has been updated.'
data:
avatar_url: /storage/avatars/employees/BlRaQOE7e1f5iXoxW40ek9H2IYGSe998YjY9LItd.jpg
errors: null
meta:
request_id: c3d2c124-78c4-49c6-beac-5278c8e18aed
timestamp: '2026-08-05T16:18:35.399573Z'
422:
description: 'Not an image'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- VALIDATION_ERROR
message:
type: string
examples:
- 'The given data was invalid.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type: string
examples:
- photo
message:
type: string
examples:
- 'The photo must be an image.'
examples:
-
-
field: photo
message: 'The photo must be an image.'
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-07-28T10:00:00.000000Z'
examples:
-
status: VALIDATION_ERROR
message: 'The given data was invalid.'
data: null
errors:
-
field: photo
message: 'The photo must be an image.'
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-07-28T10:00:00.000000Z'
tags:
- 'Mobile API'
requestBody:
required: true
content:
multipart/form-data:
schema:
type: object
properties:
photo:
type: string
format: binary
description: ''
required:
- photo
/api/v1/mobile/profile/email/request-change:
post:
summary: 'Request Email Change'
operationId: requestEmailChange
description: 'Request an email change with verification to the new email.'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Verification email sent. Please check your inbox to confirm the change.'
data:
type: object
properties:
pending_email:
type: string
examples:
- ganz.neue@example.at
expires_at:
type: string
examples:
- '2026-08-05T16:48:35+00:00'
verification_sent_to:
type: string
examples:
- ganz.neue@example.at
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- f0798fcd-a4d3-4ab4-b502-97285b1866f5
timestamp:
type: string
examples:
- '2026-08-05T16:18:35.641680Z'
examples:
-
status: SUCCESS
message: 'Verification email sent. Please check your inbox to confirm the change.'
data:
pending_email: ganz.neue@example.at
expires_at: '2026-08-05T16:48:35+00:00'
verification_sent_to: ganz.neue@example.at
errors: null
meta:
request_id: f0798fcd-a4d3-4ab4-b502-97285b1866f5
timestamp: '2026-08-05T16:18:35.641680Z'
409:
description: 'Address already in use'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- EMAIL_ALREADY_EXISTS
message:
type: string
examples:
- 'That email address is already taken.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type: string
examples:
- new_email
message:
type: string
examples:
- 'That email address is already taken.'
examples:
-
-
field: new_email
message: 'That email address is already taken.'
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-07-28T10:00:00.000000Z'
examples:
-
status: EMAIL_ALREADY_EXISTS
message: 'That email address is already taken.'
data: null
errors:
-
field: new_email
message: 'That email address is already taken.'
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-07-28T10:00:00.000000Z'
tags:
- 'Mobile API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
new_email:
type: string
description: ''
examples:
- name@example.at
password:
type: string
description: ''
examples:
- S3cure-Passw0rd!
required:
- new_email
- password
/api/v1/mobile/profile/email/pending:
delete:
summary: 'Cancel Pending Email'
operationId: cancelPendingEmail
description: 'Cancel a pending email change request.'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'The pending email change has been cancelled.'
data:
type: object
properties:
cancelled_email:
type: string
examples:
- neue.adresse@example.at
current_email:
type: string
examples:
- pending@demo.flexxr.at
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 1afeaa90-82ab-4363-8d65-679ca592a11a
timestamp:
type: string
examples:
- '2026-08-05T16:18:35.656630Z'
examples:
-
status: SUCCESS
message: 'The pending email change has been cancelled.'
data:
cancelled_email: neue.adresse@example.at
current_email: pending@demo.flexxr.at
errors: null
meta:
request_id: 1afeaa90-82ab-4363-8d65-679ca592a11a
timestamp: '2026-08-05T16:18:35.656630Z'
tags:
- 'Mobile API'
/api/v1/mobile/profile/phone:
post:
summary: 'Set Phone Number'
operationId: setPhoneNumber
description: "Add a phone number (country code + local number, as in registration)\nto an account whose phone has never been verified — typically a\nsocial-login account. Refused once a verified number exists; use the\nphone-change flow instead."
parameters: []
responses:
200:
description: Saved
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Phone number saved. Please verify it.'
data:
type: object
properties:
country_code:
type: string
examples:
- '+43'
phone_number:
type: string
examples:
- '6641234567'
phone:
type: string
examples:
- '+436641234567'
phone_verified:
type: boolean
examples:
- false
next_step:
type: string
examples:
- phone_verification
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-08-13T10:00:00.000000Z'
examples:
-
status: SUCCESS
message: 'Phone number saved. Please verify it.'
data:
country_code: '+43'
phone_number: '6641234567'
phone: '+436641234567'
phone_verified: false
next_step: phone_verification
errors: null
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-08-13T10:00:00.000000Z'
409:
description: ''
content:
application/json:
schema:
oneOf:
-
description: 'Already verified'
type: object
properties:
status:
type: string
examples:
- INVALID_OPERATION
message:
type: string
examples:
- 'Your phone number is verified. Use the phone change flow to replace it.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-08-13T10:00:00.000000Z'
examples:
-
status: INVALID_OPERATION
message: 'Your phone number is verified. Use the phone change flow to replace it.'
data: null
errors: null
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-08-13T10:00:00.000000Z'
-
description: 'Number taken'
type: object
properties:
status:
type: string
examples:
- PHONE_ALREADY_EXISTS
message:
type: string
examples:
- 'This phone number is already registered to another account.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type: string
examples:
- phone_number
message:
type: string
examples:
- 'This phone number is already registered to another account.'
examples:
-
-
field: phone_number
message: 'This phone number is already registered to another account.'
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-08-13T10:00:00.000000Z'
examples:
-
status: PHONE_ALREADY_EXISTS
message: 'This phone number is already registered to another account.'
data: null
errors:
-
field: phone_number
message: 'This phone number is already registered to another account.'
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-08-13T10:00:00.000000Z'
tags:
- 'Mobile API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
country_code:
type: string
description: '**Required.** Phone country code (E.164 prefix). Must match the regex /^\+[1-9]\d{0,3}$/. Must not be greater than 5 characters.'
examples:
- '+43'
phone_number:
type: string
description: '**Required.** Local phone number (digits only). Must match the regex /^\d+$/. Must not be greater than 15 characters.'
examples:
- '6641234567'
required:
- country_code
- phone_number
/api/v1/mobile/profile/phone/request-change:
post:
summary: 'Request Phone Change'
operationId: requestPhoneChange
description: 'Request a phone number change.'
parameters: []
responses:
200:
description: 'Code sent'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'We sent a verification code to the new number.'
data:
type: object
properties:
pending_phone:
type: string
examples:
- '+436641234567'
expires_at:
type: string
examples:
- '2026-07-28T10:10:00+00:00'
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-07-28T10:00:00.000000Z'
examples:
-
status: SUCCESS
message: 'We sent a verification code to the new number.'
data:
pending_phone: '+436641234567'
expires_at: '2026-07-28T10:10:00+00:00'
errors: null
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-07-28T10:00:00.000000Z'
tags:
- 'Mobile API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
country_code:
type: string
description: ''
examples:
- AT
phone_number:
type: string
description: ''
examples:
- '6641234567'
required:
- country_code
- phone_number
/api/v1/mobile/profile/phone/verify:
post:
summary: 'Verify Phone Change'
operationId: verifyPhoneChange
description: 'Complete a phone number change using a Firebase Phone Auth ID token.'
parameters: []
responses:
200:
description: Verified
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Phone number updated.'
data:
type: object
properties:
phone_number:
type: string
examples:
- '6641234567'
country_code:
type: string
examples:
- '+43'
phone_verified_at:
type: string
examples:
- '2026-07-28T10:05:00+00:00'
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-07-28T10:00:00.000000Z'
examples:
-
status: SUCCESS
message: 'Phone number updated.'
data:
phone_number: '6641234567'
country_code: '+43'
phone_verified_at: '2026-07-28T10:05:00+00:00'
errors: null
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-07-28T10:00:00.000000Z'
422:
description: 'Wrong code'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- VALIDATION_ERROR
message:
type: string
examples:
- 'That code is not valid.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type: string
examples:
- code
message:
type: string
examples:
- 'That code is not valid.'
examples:
-
-
field: code
message: 'That code is not valid.'
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-07-28T10:00:00.000000Z'
examples:
-
status: VALIDATION_ERROR
message: 'That code is not valid.'
data: null
errors:
-
field: code
message: 'That code is not valid.'
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-07-28T10:00:00.000000Z'
tags:
- 'Mobile API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
firebase_id_token:
type: string
description: ''
examples:
- Beispieltext
required:
- firebase_id_token
/api/v1/mobile/profile/phone/pending:
delete:
summary: 'Cancel Pending Phone'
operationId: cancelPendingPhone
description: 'Cancel a pending phone change request.'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'The pending phone change has been cancelled.'
data:
type: object
properties:
cancelled_phone:
type: string
examples:
- '+436641239876'
current_phone:
type: string
examples:
- '+436769876543'
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 64b580b3-bf62-4a88-9be6-28b5ed633dcc
timestamp:
type: string
examples:
- '2026-08-05T16:18:35.683946Z'
examples:
-
status: SUCCESS
message: 'The pending phone change has been cancelled.'
data:
cancelled_phone: '+436641239876'
current_phone: '+436769876543'
errors: null
meta:
request_id: 64b580b3-bf62-4a88-9be6-28b5ed633dcc
timestamp: '2026-08-05T16:18:35.683946Z'
tags:
- 'Mobile API'
/api/v1/mobile/documents:
get:
summary: 'List My Documents'
operationId: listMyDocuments
description: "Everything the worker has uploaded, with each document's review state —\n`pending`, `verified`, `rejected`, `reupload_requested`, `expired` or\n`superseded` — and the reviewer's note where one was left."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
documents:
type: array
items:
type: object
properties:
id:
type: string
examples:
- 019fd2b7-f280-73fe-83af-4fdd5f9db332
type:
type: string
examples:
- id_card
type_label:
type: string
examples:
- 'ID card'
original_filename:
type: string
examples:
- ausweis.pdf
status:
type: string
examples:
- pending
status_label:
type: string
examples:
- Ausstehend
status_color:
type: string
examples:
- yellow
rejection_reason:
type:
- string
- 'null'
examples:
- null
expires_at:
type:
- string
- 'null'
examples:
- null
is_expired:
type: boolean
examples:
- false
expires_soon:
type: boolean
examples:
- false
is_valid:
type: boolean
examples:
- false
created_at:
type: string
examples:
- '2026-08-05 16:18:18'
examples:
-
-
id: 019fd2b7-f280-73fe-83af-4fdd5f9db332
type: id_card
type_label: 'ID card'
original_filename: ausweis.pdf
status: pending
status_label: Ausstehend
status_color: yellow
rejection_reason: null
expires_at: null
is_expired: false
expires_soon: false
is_valid: false
created_at: '2026-08-05 16:18:18'
-
id: 019fd2b8-28ce-735c-aa32-c03c49655e69
type: passport
type_label: Passport
original_filename: veniam.pdf
status: verified
status_label: Verifiziert
status_color: green
rejection_reason: null
expires_at: '2033-05-22'
is_expired: false
expires_soon: false
is_valid: true
created_at: '2026-08-05 16:18:32'
counts:
type: object
properties:
total:
type: integer
examples:
- 2
pending:
type: integer
examples:
- 1
verified:
type: integer
examples:
- 1
rejected:
type: integer
examples:
- 0
expiring_soon:
type: integer
examples:
- 0
examples:
-
status: SUCCESS
data:
documents:
-
id: 019fd2b7-f280-73fe-83af-4fdd5f9db332
type: id_card
type_label: 'ID card'
original_filename: ausweis.pdf
status: pending
status_label: Ausstehend
status_color: yellow
rejection_reason: null
expires_at: null
is_expired: false
expires_soon: false
is_valid: false
created_at: '2026-08-05 16:18:18'
-
id: 019fd2b8-28ce-735c-aa32-c03c49655e69
type: passport
type_label: Passport
original_filename: veniam.pdf
status: verified
status_label: Verifiziert
status_color: green
rejection_reason: null
expires_at: '2033-05-22'
is_expired: false
expires_soon: false
is_valid: true
created_at: '2026-08-05 16:18:32'
counts:
total: 2
pending: 1
verified: 1
rejected: 0
expiring_soon: 0
tags:
- 'Mobile API'
post:
summary: 'Upload a Document'
operationId: uploadADocument
description: "Submits one of the documents the profile or a job requires. The `type`\nmatches the `requirement_code` returned by\n`GET /jobs/{jobId}/requirements`, so the app can pass it straight through\nfrom the row the worker tapped.\n\nUploading does not satisfy a requirement on its own — the document lands\nas `pending` and an administrator verifies it. Until then the checklist\nstill reports the item as outstanding, and applications that depend on it\nare still refused.\n\nTwo-sided documents may send `file_back` alongside `file`."
parameters: []
responses:
201:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'The document has been uploaded successfully.'
data:
type: object
properties:
document:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-672d-7348-ae17-4de67610d176
type:
type: string
examples:
- work_permit
type_label:
type: string
examples:
- 'Work permit'
original_filename:
type: string
examples:
- reisepass.pdf
status:
type: string
examples:
- pending
status_label:
type: string
examples:
- Ausstehend
status_color:
type: string
examples:
- yellow
rejection_reason:
type:
- string
- 'null'
examples:
- null
expires_at:
type: string
examples:
- '2027-08-05'
is_expired:
type: boolean
examples:
- false
expires_soon:
type: boolean
examples:
- false
is_valid:
type: boolean
examples:
- false
created_at:
type: string
examples:
- '2026-08-05 16:18:48'
has_back_side:
type: boolean
examples:
- false
examples:
-
status: SUCCESS
message: 'The document has been uploaded successfully.'
data:
document:
id: 019fd2b8-672d-7348-ae17-4de67610d176
type: work_permit
type_label: 'Work permit'
original_filename: reisepass.pdf
status: pending
status_label: Ausstehend
status_color: yellow
rejection_reason: null
expires_at: '2027-08-05'
is_expired: false
expires_soon: false
is_valid: false
created_at: '2026-08-05 16:18:48'
has_back_side: false
422:
description: 'Rejected file'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- VALIDATION_ERROR
message:
type: string
examples:
- 'The file must be a PDF or image and no larger than the configured limit.'
examples:
-
status: VALIDATION_ERROR
message: 'The file must be a PDF or image and no larger than the configured limit.'
tags:
- 'Mobile API'
requestBody:
required: true
content:
multipart/form-data:
schema:
type: object
properties:
type:
type: string
description: 'The document type, matching the requirement code. Allowed: passport, id_card, driver_license, work_permit, residence_permit, rot_weiss_rot_karte, blue_card, bank_statement, proof_of_address, social_insurance_card, tax_document, certification, health_certificate, criminal_record_check, other.'
examples:
- social_insurance_card
file:
type: string
format: binary
description: 'The scan or photograph. PDF, JPEG, PNG or WebP.'
file_back:
type: string
format: binary
description: 'The reverse side, for cards that have one.'
document_number:
type: string
description: 'Number printed on the document.'
examples:
- AT1234567
issued_at:
type: date
description: 'Date of issue; cannot be in the future.'
examples:
- '2024-03-01'
expires_at:
type: date
description: 'Expiry date. Required for work-authorisation documents — permits, Rot-Weiß-Rot Karte, EU Blue Card.'
examples:
- '2034-03-01'
issuing_country:
type: string
description: 'Two-letter ISO code of the issuing state.'
examples:
- AT
issuing_authority:
type: string
description: 'Authority that issued it.'
examples:
- 'Magistrat Wien'
required:
- type
- file
/api/v1/mobile/documents/checklist:
get:
summary: 'Get Document Checklist'
operationId: getDocumentChecklist
description: "Which documents this worker must provide before their profile can be\nsubmitted, and whether each is satisfied. The set is not fixed: a\nthird-country national is additionally asked for work authorisation,\nresolved from the residence status on their profile.\n\n`items` holds both kinds in one list, required ones first, each marked\nwith `required`:\n\n- `required: true` — the platform asks every worker for this, and it\n gates profile submission. Only these decide `ready`.\n- `required: false` — nobody is obliged to hold it, but a company may put\n it on a job as a requirement. Returned so a worker can upload one\n before any job asks: verification is a manual review rather than an\n instant check, so arriving with the document already verified is the\n difference between applying and missing the deadline.\n\n`accepts` lists the document types that satisfy the item — several for a\nrequired slot (identity takes a passport *or* an ID card), exactly one\nfor an optional entry. Those values are what `POST /mobile/documents`\ntakes as `type` and what a job requirement names, so an upload made from\nthis list satisfies the matching requirement with no further mapping.\n\n`document` is the file answering the item, in the same shape\n`GET /mobile/documents` returns, or `null` when nothing has been\nuploaded against it. Where a worker holds several of one type the most\nrelevant wins, so a replacement outranks the rejection it replaced.\n\nNote that `satisfied` means \"on file\", which includes a document still\nunder review — `document.status` is what separates `pending` from\n`verified`, and only a verified one counts towards a job requirement.\n\n`counts` summarises the worker's uploads and matches\n`GET /mobile/documents` exactly, so the screen needs one call rather\nthan two.\n\nThis is the account-level checklist. For what a *particular job* demands,\nuse `GET /jobs/{jobId}/requirements`."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'The document checklist has been retrieved.'
data:
type: object
properties:
ready:
type: boolean
examples:
- false
items:
type: array
items:
type: object
properties:
key:
type: string
examples:
- identity
label:
type: string
examples:
- 'Reisepass oder Personalausweis'
accepts:
type: array
items:
type: string
examples:
-
- passport
- id_card
required:
type: boolean
examples:
- true
satisfied:
type: boolean
examples:
- true
document:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-28ce-735c-aa32-c03c49655e69
type:
type: string
examples:
- passport
type_label:
type: string
examples:
- Passport
original_filename:
type: string
examples:
- veniam.pdf
status:
type: string
examples:
- verified
status_label:
type: string
examples:
- Verifiziert
status_color:
type: string
examples:
- green
rejection_reason:
type:
- string
- 'null'
examples:
- null
expires_at:
type: string
examples:
- '2033-05-22'
is_expired:
type: boolean
examples:
- false
expires_soon:
type: boolean
examples:
- false
is_valid:
type: boolean
examples:
- true
created_at:
type: string
examples:
- '2026-08-05 16:18:32'
examples:
-
-
key: identity
label: 'Reisepass oder Personalausweis'
accepts:
- passport
- id_card
required: true
satisfied: true
document:
id: 019fd2b8-28ce-735c-aa32-c03c49655e69
type: passport
type_label: Passport
original_filename: veniam.pdf
status: verified
status_label: Verifiziert
status_color: green
rejection_reason: null
expires_at: '2033-05-22'
is_expired: false
expires_soon: false
is_valid: true
created_at: '2026-08-05 16:18:32'
-
key: address_proof
label: Meldezettel
accepts:
- proof_of_address
required: true
satisfied: false
document: null
-
key: social_insurance
label: 'e-card (Sozialversicherung)'
accepts:
- social_insurance_card
required: true
satisfied: false
document: null
-
key: bank
label: Kontoauszug
accepts:
- bank_statement
required: true
satisfied: false
document: null
-
key: driver_license
label: "Driver's licence"
accepts:
- driver_license
required: false
satisfied: false
document: null
-
key: certification
label: Certification
accepts:
- certification
required: false
satisfied: false
document: null
-
key: health_certificate
label: 'Health certificate'
accepts:
- health_certificate
required: false
satisfied: false
document: null
-
key: criminal_record_check
label: 'Criminal record check'
accepts:
- criminal_record_check
required: false
satisfied: false
document: null
-
key: tax_document
label: 'Tax document'
accepts:
- tax_document
required: false
satisfied: false
document: null
counts:
type: object
properties:
total:
type: integer
examples:
- 2
pending:
type: integer
examples:
- 1
verified:
type: integer
examples:
- 1
rejected:
type: integer
examples:
- 0
expiring_soon:
type: integer
examples:
- 0
examples:
-
status: SUCCESS
message: 'The document checklist has been retrieved.'
data:
ready: false
items:
-
key: identity
label: 'Reisepass oder Personalausweis'
accepts:
- passport
- id_card
required: true
satisfied: true
document:
id: 019fd2b8-28ce-735c-aa32-c03c49655e69
type: passport
type_label: Passport
original_filename: veniam.pdf
status: verified
status_label: Verifiziert
status_color: green
rejection_reason: null
expires_at: '2033-05-22'
is_expired: false
expires_soon: false
is_valid: true
created_at: '2026-08-05 16:18:32'
-
key: address_proof
label: Meldezettel
accepts:
- proof_of_address
required: true
satisfied: false
document: null
-
key: social_insurance
label: 'e-card (Sozialversicherung)'
accepts:
- social_insurance_card
required: true
satisfied: false
document: null
-
key: bank
label: Kontoauszug
accepts:
- bank_statement
required: true
satisfied: false
document: null
-
key: driver_license
label: "Driver's licence"
accepts:
- driver_license
required: false
satisfied: false
document: null
-
key: certification
label: Certification
accepts:
- certification
required: false
satisfied: false
document: null
-
key: health_certificate
label: 'Health certificate'
accepts:
- health_certificate
required: false
satisfied: false
document: null
-
key: criminal_record_check
label: 'Criminal record check'
accepts:
- criminal_record_check
required: false
satisfied: false
document: null
-
key: tax_document
label: 'Tax document'
accepts:
- tax_document
required: false
satisfied: false
document: null
counts:
total: 2
pending: 1
verified: 1
rejected: 0
expiring_soon: 0
tags:
- 'Mobile API'
'/api/v1/mobile/documents/{documentId}':
get:
summary: 'Get a Document'
operationId: getADocument
description: "One document with its review state and, when a reviewer rejected it, the\nreason they gave."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
document:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-6103-7134-bdc4-ac4ec15c8ab5
type:
type: string
examples:
- passport
type_label:
type: string
examples:
- Passport
original_filename:
type: string
examples:
- reisepass.pdf
mime_type:
type: string
examples:
- application/pdf
file_size:
type: integer
examples:
- 131072
status:
type: string
examples:
- ocr_failed
status_label:
type: string
examples:
- 'OCR fehlgeschlagen'
status_color:
type: string
examples:
- orange
rejection_reason:
type:
- string
- 'null'
examples:
- null
document_number:
type:
- string
- 'null'
examples:
- null
issued_at:
type:
- string
- 'null'
examples:
- null
expires_at:
type:
- string
- 'null'
examples:
- null
issuing_country:
type:
- string
- 'null'
examples:
- null
issuing_authority:
type:
- string
- 'null'
examples:
- null
is_expired:
type: boolean
examples:
- false
expires_soon:
type: boolean
examples:
- false
is_valid:
type: boolean
examples:
- false
reviewed_at:
type:
- string
- 'null'
examples:
- null
created_at:
type: string
examples:
- '2026-08-05 16:18:46'
download_url:
type: string
examples:
- 'http://localhost:8001/api/v1/mobile/documents/019fd2b8-6103-7134-bdc4-ac4ec15c8ab5/download'
has_back_side:
type: boolean
examples:
- false
examples:
-
status: SUCCESS
data:
document:
id: 019fd2b8-6103-7134-bdc4-ac4ec15c8ab5
type: passport
type_label: Passport
original_filename: reisepass.pdf
mime_type: application/pdf
file_size: 131072
status: ocr_failed
status_label: 'OCR fehlgeschlagen'
status_color: orange
rejection_reason: null
document_number: null
issued_at: null
expires_at: null
issuing_country: null
issuing_authority: null
is_expired: false
expires_soon: false
is_valid: false
reviewed_at: null
created_at: '2026-08-05 16:18:46'
download_url: 'http://localhost:8001/api/v1/mobile/documents/019fd2b8-6103-7134-bdc4-ac4ec15c8ab5/download'
has_back_side: false
tags:
- 'Mobile API'
post:
summary: 'Replace a Document'
operationId: replaceADocument
description: "Supersedes an existing document — used after a reviewer rejects one or\nasks for a fresh copy, and when the original has expired. The previous\nversion is archived rather than deleted, so the review history stays\nintact, and the replacement enters `pending` for verification.\n\nThe type is taken from the document being replaced and cannot be changed;\nupload a new document instead. Everything else the upload endpoint\naccepts is accepted here, `file_back` included — a two-sided document\nreplaced without its reverse side would lose it.\n\n`expires_at` is required when replacing a work-authorisation document\n(permit, Rot-Weiß-Rot Karte, EU Blue Card): that date decides whether its\nholder may still be sent to a shift, and one without it counts as\nexpired.\n\nThis is a `POST` with a `multipart/form-data` body. It also needs an\n`Idempotency-Key` header; replaying the same key returns the first result\nrather than superseding the document twice."
parameters: []
responses:
201:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'The document has been re-uploaded and is awaiting review.'
data:
type: object
properties:
document:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-36f1-70c6-8a88-6e076134cc2a
type:
type: string
examples:
- id_card
type_label:
type: string
examples:
- 'ID card'
original_filename:
type: string
examples:
- beispiel.pdf
status:
type: string
examples:
- pending
status_label:
type: string
examples:
- Ausstehend
status_color:
type: string
examples:
- yellow
rejection_reason:
type:
- string
- 'null'
examples:
- null
expires_at:
type: string
examples:
- '2034-03-01'
is_expired:
type: boolean
examples:
- false
expires_soon:
type: boolean
examples:
- false
is_valid:
type: boolean
examples:
- false
created_at:
type: string
examples:
- '2026-08-05 16:18:35'
supersedes:
type: string
examples:
- 019fd2b7-f280-73fe-83af-4fdd5f9db332
examples:
-
status: SUCCESS
message: 'The document has been re-uploaded and is awaiting review.'
data:
document:
id: 019fd2b8-36f1-70c6-8a88-6e076134cc2a
type: id_card
type_label: 'ID card'
original_filename: beispiel.pdf
status: pending
status_label: Ausstehend
status_color: yellow
rejection_reason: null
expires_at: '2034-03-01'
is_expired: false
expires_soon: false
is_valid: false
created_at: '2026-08-05 16:18:35'
supersedes: 019fd2b7-f280-73fe-83af-4fdd5f9db332
tags:
- 'Mobile API'
requestBody:
required: true
content:
multipart/form-data:
schema:
type: object
properties:
file:
type: string
format: binary
description: 'The new scan or photograph. PDF, JPEG, PNG or WebP.'
file_back:
type: string
format: binary
description: 'The reverse side, for cards that have one.'
document_number:
type: string
description: 'Number printed on the document.'
examples:
- AT1234567
issued_at:
type: date
description: 'Date of issue; cannot be in the future.'
examples:
- '2024-03-01'
expires_at:
type: date
description: 'Expiry date. Required when replacing a work-authorisation document.'
examples:
- '2034-03-01'
issuing_country:
type: string
description: 'Two-letter ISO code of the issuing state.'
examples:
- AT
issuing_authority:
type: string
description: 'Authority that issued it.'
examples:
- 'Magistrat Wien'
required:
- file
delete:
summary: 'Delete a Document'
operationId: deleteADocument
description: "Removes a document the worker uploaded. A verified document that a\nrequirement depends on cannot simply be dropped — replace it instead, so\nthe profile does not silently fall out of compliance."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'The document has been deleted successfully.'
examples:
-
status: SUCCESS
message: 'The document has been deleted successfully.'
tags:
- 'Mobile API'
parameters:
-
in: path
name: documentId
description: ''
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
'/api/v1/mobile/documents/{documentId}/download':
get:
summary: 'Download a Document'
operationId: downloadADocument
description: "Streams the worker's own file. The link is short-lived by design — a\ndocument contains identity data and should not sit in a shareable URL."
parameters: []
responses:
503:
description: ''
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- ERROR
message:
type: string
examples:
- 'Service Unavailable'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type:
- string
- 'null'
examples:
- null
message:
type: string
examples:
- 'Service Unavailable'
examples:
-
-
field: null
message: 'Service Unavailable'
meta:
type: object
properties:
request_id:
type: string
examples:
- 948c444a-46c2-4c6e-b672-2eb6ffadfda0
timestamp:
type: string
examples:
- '2026-08-21T05:14:33.114939Z'
examples:
-
status: ERROR
message: 'Service Unavailable'
data: null
errors:
-
field: null
message: 'Service Unavailable'
meta:
request_id: 948c444a-46c2-4c6e-b672-2eb6ffadfda0
timestamp: '2026-08-21T05:14:33.114939Z'
tags:
- 'Mobile API'
parameters:
-
in: path
name: documentId
description: ''
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
/api/v1/mobile/attachments:
get:
summary: 'List My Attachments'
operationId: listMyAttachments
description: "Files the worker has supplied that the platform does not review — a\nreference, a course certificate, anything a company asked to see that the\ndocument types do not name.\n\nThese are not documents. They carry no review status and no expiry, a\nworker may hold as many as they like, and **none of them satisfies a job\nrequirement** — nothing has checked what they contain. Use\n`GET /mobile/documents` for the reviewed set.\n\nThey share the worker's storage quota with documents, so `quota` is\nreturned alongside: `used_bytes` split by what is consuming it, against\nthe same `limit_bytes` an upload is refused for exceeding."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
attachments:
type: array
items:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-29e0-72e1-be30-9be100181d40
label:
type: string
examples:
- 'voluptas nihil'
original_filename:
type: string
examples:
- est.pdf
mime_type:
type: string
examples:
- application/pdf
file_size:
type: integer
examples:
- 293696
scanned_at:
type: string
examples:
- '2026-08-05T16:18:32+00:00'
created_at:
type: string
examples:
- '2026-08-05 16:18:32'
examples:
-
-
id: 019fd2b8-29e0-72e1-be30-9be100181d40
label: 'voluptas nihil'
original_filename: est.pdf
mime_type: application/pdf
file_size: 293696
scanned_at: '2026-08-05T16:18:32+00:00'
created_at: '2026-08-05 16:18:32'
quota:
type: object
properties:
used_bytes:
type: integer
examples:
- 1270224
documents_bytes:
type: integer
examples:
- 976528
attachments_bytes:
type: integer
examples:
- 293696
limit_bytes:
type: integer
examples:
- 104857600
available_bytes:
type: integer
examples:
- 103587376
examples:
-
status: SUCCESS
data:
attachments:
-
id: 019fd2b8-29e0-72e1-be30-9be100181d40
label: 'voluptas nihil'
original_filename: est.pdf
mime_type: application/pdf
file_size: 293696
scanned_at: '2026-08-05T16:18:32+00:00'
created_at: '2026-08-05 16:18:32'
quota:
used_bytes: 1270224
documents_bytes: 976528
attachments_bytes: 293696
limit_bytes: 104857600
available_bytes: 103587376
tags:
- 'Mobile API'
post:
summary: 'Add an Attachment'
operationId: addAnAttachment
description: "Supplies a file the platform does not review: a reference, a course\ncertificate, whatever a company asked to see that the document types do\nnot name. `label` says what it is, and is required — a reviewer looking at\nan application cannot act on an untitled file.\n\nA worker may hold as many as they like, including several with the same\nlabel. Nothing here expires, nothing enters the review queue, and **an\nattachment never satisfies a job requirement** — the platform has not\nchecked it. Use `POST /mobile/documents` for anything that has to be\nverified.\n\nThe file is still scanned for malware, and still counts against the same\nstorage quota as documents; an infected file is removed rather than\nrejected, since there is no review state to move it to.\n\nSame size and format limits as a document: PDF, JPEG, PNG or WebP."
parameters: []
responses:
201:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'The attachment has been added.'
data:
type: object
properties:
attachment:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-3720-719d-87d9-bb06b1cafe16
label:
type: string
examples:
- Staplerschein
original_filename:
type: string
examples:
- beispiel.pdf
mime_type:
type: string
examples:
- application/pdf
file_size:
type: integer
examples:
- 65536
scanned_at:
type:
- string
- 'null'
examples:
- null
created_at:
type: string
examples:
- '2026-08-05 16:18:35'
quota:
type: object
properties:
used_bytes:
type: integer
examples:
- 1335760
documents_bytes:
type: integer
examples:
- 976528
attachments_bytes:
type: integer
examples:
- 359232
limit_bytes:
type: integer
examples:
- 104857600
available_bytes:
type: integer
examples:
- 103521840
examples:
-
status: SUCCESS
message: 'The attachment has been added.'
data:
attachment:
id: 019fd2b8-3720-719d-87d9-bb06b1cafe16
label: Staplerschein
original_filename: beispiel.pdf
mime_type: application/pdf
file_size: 65536
scanned_at: null
created_at: '2026-08-05 16:18:35'
quota:
used_bytes: 1335760
documents_bytes: 976528
attachments_bytes: 359232
limit_bytes: 104857600
available_bytes: 103521840
422:
description: 'Quota exhausted'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- INVALID_OPERATION
message:
type: string
examples:
- 'The storage quota has been reached.'
data:
type: object
properties:
quota:
type: object
properties:
used_bytes:
type: integer
examples:
- 104857600
documents_bytes:
type: integer
examples:
- 94371840
attachments_bytes:
type: integer
examples:
- 10485760
limit_bytes:
type: integer
examples:
- 104857600
available_bytes:
type: integer
examples:
- 0
examples:
-
status: INVALID_OPERATION
message: 'The storage quota has been reached.'
data:
quota:
used_bytes: 104857600
documents_bytes: 94371840
attachments_bytes: 10485760
limit_bytes: 104857600
available_bytes: 0
tags:
- 'Mobile API'
requestBody:
required: true
content:
multipart/form-data:
schema:
type: object
properties:
label:
type: string
description: 'What the file is.'
examples:
- Staplerschein
file:
type: string
format: binary
description: 'The file itself. PDF, JPEG, PNG or WebP.'
required:
- label
- file
'/api/v1/mobile/attachments/{attachmentId}':
delete:
summary: 'Delete an Attachment'
operationId: deleteAnAttachment
description: "Removes a file the worker attached, freeing the storage it occupied.\nNothing depends on an attachment — it satisfies no requirement and is\npart of no review — so it is deleted outright rather than superseded the\nway a document is."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'The attachment has been removed.'
examples:
-
status: SUCCESS
message: 'The attachment has been removed.'
404:
description: 'Not found'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- RESOURCE_NOT_FOUND
message:
type: string
examples:
- 'The attachment was not found.'
examples:
-
status: RESOURCE_NOT_FOUND
message: 'The attachment was not found.'
tags:
- 'Mobile API'
parameters:
-
in: path
name: attachmentId
description: 'The attachment to remove.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
/api/v1/mobile/job-categories:
get:
summary: 'List Job Categories'
operationId: listJobCategories
description: "Returns all active job categories in a hierarchical structure.\nRoot categories are returned at the top level; their active children are\nnested under the `children` key."
parameters:
-
in: query
name: include_children
description: 'Include child categories nested under each root (default true).'
required: false
schema:
type: boolean
description: 'Include child categories nested under each root (default true).'
examples:
- true
-
in: query
name: featured_only
description: 'Return only featured root categories.'
required: false
schema:
type: boolean
description: 'Return only featured root categories.'
examples:
- false
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
categories:
type: array
items:
type: object
properties:
id:
type: string
examples:
- 019fd2b7-f371-732c-8cdb-6de13be42891
slug:
type: string
examples:
- gastro
name:
type: string
examples:
- Gastronomie
name_en:
type: string
examples:
- Gastronomy
name_localized:
type: string
examples:
- Gastronomy
icon:
type: string
examples:
- utensils
color:
type:
- string
- 'null'
examples:
- null
kollektivvertrag:
type: string
examples:
- Gastgewerbe
description:
type:
- string
- 'null'
examples:
- null
is_featured:
type: boolean
examples:
- true
parent_id:
type:
- string
- 'null'
examples:
- null
sort_order:
type: integer
examples:
- 1
children:
type: array
examples:
- []
examples:
-
-
id: 019fd2b7-f371-732c-8cdb-6de13be42891
slug: gastro
name: Gastronomie
name_en: Gastronomy
name_localized: Gastronomy
icon: utensils
color: null
kollektivvertrag: Gastgewerbe
description: null
is_featured: true
parent_id: null
sort_order: 1
children: []
-
id: 019fd2b7-f375-724e-84b8-4f9647ef6419
slug: hotel
name: Hotellerie
name_en: Hospitality
name_localized: Hospitality
icon: hotel
color: null
kollektivvertrag: 'Hotel- und Gastgewerbe'
description: null
is_featured: true
parent_id: null
sort_order: 2
children: []
-
id: 019fd2b7-f377-7108-8400-efa89715a39f
slug: food_service
name: 'Food Service'
name_en: 'Food Service'
name_localized: 'Food Service'
icon: utensils
color: null
kollektivvertrag: Gastgewerbe
description: null
is_featured: false
parent_id: null
sort_order: 3
children: []
-
id: 019fd2b7-f37a-72a9-84a9-7862f636e2fd
slug: catering
name: Catering
name_en: Catering
name_localized: Catering
icon: utensils
color: null
kollektivvertrag: Gastgewerbe
description: null
is_featured: false
parent_id: null
sort_order: 4
children: []
-
id: 019fd2b7-f37d-712d-92b3-aa5540f6b2a7
slug: retail
name: Einzelhandel
name_en: Retail
name_localized: Retail
icon: shopping-cart
color: null
kollektivvertrag: Handel
description: null
is_featured: false
parent_id: null
sort_order: 5
children: []
-
id: 019fd2b7-f380-7300-91c6-75c968e6d045
slug: supermarket
name: Lebensmittelhandel
name_en: Grocery
name_localized: Grocery
icon: shopping-cart
color: null
kollektivvertrag: Handel
description: null
is_featured: false
parent_id: null
sort_order: 6
children: []
-
id: 019fd2b7-f384-7071-b096-674d16b4ad00
slug: pharmacy
name: Apotheke
name_en: Pharmacy
name_localized: Pharmacy
icon: heart-pulse
color: null
kollektivvertrag: 'Pharmazeutischer Großhandel'
description: null
is_featured: false
parent_id: null
sort_order: 7
children: []
-
id: 019fd2b7-f388-7098-b463-ae170338e60f
slug: production
name: Produktion
name_en: Production
name_localized: Production
icon: industry
color: null
kollektivvertrag: Industrie
description: null
is_featured: false
parent_id: null
sort_order: 8
children: []
-
id: 019fd2b7-f38b-7209-8b83-b345b172def2
slug: warehouse
name: Lager
name_en: Warehouse
name_localized: Warehouse
icon: industry
color: null
kollektivvertrag: Industrie
description: null
is_featured: false
parent_id: null
sort_order: 9
children: []
-
id: 019fd2b7-f38e-7255-bfe3-0f010aca0086
slug: logistics
name: Logistik
name_en: Logistics
name_localized: Logistics
icon: truck
color: null
kollektivvertrag: Industrie
description: null
is_featured: true
parent_id: null
sort_order: 10
children: []
-
id: 019fd2b7-f391-727d-9871-61207ae27ab3
slug: manufacturing
name: Fertigung
name_en: Manufacturing
name_localized: Manufacturing
icon: industry
color: null
kollektivvertrag: Industrie
description: null
is_featured: false
parent_id: null
sort_order: 11
children: []
-
id: 019fd2b7-f394-7015-b80e-5fa954b27658
slug: transportation
name: Transport
name_en: Transportation
name_localized: Transportation
icon: truck
color: null
kollektivvertrag: Güterbeförderungsgewerbe
description: null
is_featured: false
parent_id: null
sort_order: 12
children: []
-
id: 019fd2b7-f398-7300-a216-c64584fea8f7
slug: event
name: Events
name_en: Events
name_localized: Events
icon: calendar-star
color: null
kollektivvertrag: Veranstaltungsdienstleistung
description: null
is_featured: false
parent_id: null
sort_order: 13
children: []
-
id: 019fd2b7-f39c-7064-8f21-15054bddd646
slug: security
name: Security
name_en: Security
name_localized: Security
icon: shield
color: null
kollektivvertrag: Bewachungsgewerbe
description: null
is_featured: false
parent_id: null
sort_order: 14
children: []
-
id: 019fd2b7-f39f-73e6-870b-fe7584e4f9bc
slug: office
name: Büro
name_en: Office
name_localized: Office
icon: briefcase
color: null
kollektivvertrag: Handel/Büro
description: null
is_featured: false
parent_id: null
sort_order: 15
children: []
-
id: 019fd2b7-f3a2-7147-883f-c3207db81b51
slug: reception
name: Empfang
name_en: Reception
name_localized: Reception
icon: briefcase
color: null
kollektivvertrag: Handel/Büro
description: null
is_featured: false
parent_id: null
sort_order: 16
children: []
-
id: 019fd2b7-f3a5-70a8-a3b1-9140f01abf8e
slug: call_center
name: 'Call Center'
name_en: 'Call Center'
name_localized: 'Call Center'
icon: briefcase
color: null
kollektivvertrag: Handel/Büro
description: null
is_featured: false
parent_id: null
sort_order: 17
children: []
-
id: 019fd2b7-f3a8-72f6-8ad1-0f499f6816e1
slug: customer_service
name: Kundenservice
name_en: 'Customer Service'
name_localized: 'Customer Service'
icon: briefcase
color: null
kollektivvertrag: Handel/Büro
description: null
is_featured: false
parent_id: null
sort_order: 18
children: []
-
id: 019fd2b7-f3ab-70a0-9523-b474e2007212
slug: software
name: Software
name_en: Software
name_localized: Software
icon: code
color: null
kollektivvertrag: IT-KV
description: null
is_featured: true
parent_id: null
sort_order: 19
children: []
-
id: 019fd2b7-f3c2-73b2-9873-51431d14404e
slug: it_services
name: 'IT Services'
name_en: 'IT Services'
name_localized: 'IT Services'
icon: code
color: null
kollektivvertrag: IT-KV
description: null
is_featured: false
parent_id: null
sort_order: 20
children: []
-
id: 019fd2b7-f3cc-728f-a1eb-11d5120b3dca
slug: cleaning
name: Reinigung
name_en: Cleaning
name_localized: Cleaning
icon: broom
color: null
kollektivvertrag: Gebäudereinigung
description: null
is_featured: false
parent_id: null
sort_order: 21
children: []
-
id: 019fd2b7-f3d1-72e1-a261-10207b6d759d
slug: facility
name: 'Facility Management'
name_en: 'Facility Management'
name_localized: 'Facility Management'
icon: broom
color: null
kollektivvertrag: Gebäudereinigung
description: null
is_featured: false
parent_id: null
sort_order: 22
children: []
-
id: 019fd2b7-f3d5-71b4-bece-4ea026852495
slug: care
name: Pflege/Betreuung
name_en: Care
name_localized: Care
icon: heart-pulse
color: null
kollektivvertrag: Sozialwirtschaft
description: null
is_featured: false
parent_id: null
sort_order: 23
children: []
-
id: 019fd2b7-f3d8-72d5-842e-c1f00337e9ec
slug: healthcare
name: Gesundheitswesen
name_en: Healthcare
name_localized: Healthcare
icon: heart-pulse
color: null
kollektivvertrag: Sozialwirtschaft
description: null
is_featured: false
parent_id: null
sort_order: 24
children: []
-
id: 019fd2b7-f3dc-70cb-a662-0fc23b0ec307
slug: construction
name: 'Bau (Hilfstätigkeiten)'
name_en: Construction
name_localized: Construction
icon: building
color: null
kollektivvertrag: Bauindustrie
description: null
is_featured: false
parent_id: null
sort_order: 25
children: []
-
id: 019fd2b7-f3df-70bb-8881-36c5f2234495
slug: real_estate
name: Immobilien
name_en: 'Real Estate'
name_localized: 'Real Estate'
icon: building
color: null
kollektivvertrag: Bauindustrie
description: null
is_featured: false
parent_id: null
sort_order: 26
children: []
-
id: 019fd2b7-f3e5-714f-8db2-a5ae4350ae5c
slug: graphic_design
name: Grafikdesign
name_en: 'Graphic Design'
name_localized: 'Graphic Design'
icon: palette
color: null
kollektivvertrag: Werbewirtschaft
description: null
is_featured: false
parent_id: null
sort_order: 27
children: []
-
id: 019fd2b7-f3e9-71c6-b382-7451adaf4bb7
slug: media
name: Medien
name_en: Media
name_localized: Media
icon: palette
color: null
kollektivvertrag: Werbewirtschaft
description: null
is_featured: true
parent_id: null
sort_order: 28
children: []
-
id: 019fd2b7-f3ec-717a-ac4d-13011f3096f1
slug: education
name: Bildung
name_en: Education
name_localized: Education
icon: graduation-cap
color: null
kollektivvertrag: Bildungseinrichtungen
description: null
is_featured: true
parent_id: null
sort_order: 29
children: []
-
id: 019fd2b7-f3f0-70a8-b7be-6be4c17c9429
slug: finance
name: Finanzen
name_en: Finance
name_localized: Finance
icon: chart-line
color: null
kollektivvertrag: 'Banken und Versicherungen'
description: null
is_featured: true
parent_id: null
sort_order: 30
children: []
-
id: 019fd2b7-f3f3-737d-9abe-5edb92ceb02a
slug: agriculture
name: Landwirtschaft
name_en: Agriculture
name_localized: Agriculture
icon: leaf
color: null
kollektivvertrag: 'Land- und Forstwirtschaft'
description: null
is_featured: false
parent_id: null
sort_order: 31
children: []
-
id: 019fd2b7-f3f6-70c7-868b-6ac419f0d02c
slug: other
name: Sonstiges
name_en: Other
name_localized: Other
icon: ellipsis
color: null
kollektivvertrag: Arbeitskräfteüberlasser
description: null
is_featured: false
parent_id: null
sort_order: 32
children: []
examples:
-
status: SUCCESS
data:
categories:
-
id: 019fd2b7-f371-732c-8cdb-6de13be42891
slug: gastro
name: Gastronomie
name_en: Gastronomy
name_localized: Gastronomy
icon: utensils
color: null
kollektivvertrag: Gastgewerbe
description: null
is_featured: true
parent_id: null
sort_order: 1
children: []
-
id: 019fd2b7-f375-724e-84b8-4f9647ef6419
slug: hotel
name: Hotellerie
name_en: Hospitality
name_localized: Hospitality
icon: hotel
color: null
kollektivvertrag: 'Hotel- und Gastgewerbe'
description: null
is_featured: true
parent_id: null
sort_order: 2
children: []
-
id: 019fd2b7-f377-7108-8400-efa89715a39f
slug: food_service
name: 'Food Service'
name_en: 'Food Service'
name_localized: 'Food Service'
icon: utensils
color: null
kollektivvertrag: Gastgewerbe
description: null
is_featured: false
parent_id: null
sort_order: 3
children: []
-
id: 019fd2b7-f37a-72a9-84a9-7862f636e2fd
slug: catering
name: Catering
name_en: Catering
name_localized: Catering
icon: utensils
color: null
kollektivvertrag: Gastgewerbe
description: null
is_featured: false
parent_id: null
sort_order: 4
children: []
-
id: 019fd2b7-f37d-712d-92b3-aa5540f6b2a7
slug: retail
name: Einzelhandel
name_en: Retail
name_localized: Retail
icon: shopping-cart
color: null
kollektivvertrag: Handel
description: null
is_featured: false
parent_id: null
sort_order: 5
children: []
-
id: 019fd2b7-f380-7300-91c6-75c968e6d045
slug: supermarket
name: Lebensmittelhandel
name_en: Grocery
name_localized: Grocery
icon: shopping-cart
color: null
kollektivvertrag: Handel
description: null
is_featured: false
parent_id: null
sort_order: 6
children: []
-
id: 019fd2b7-f384-7071-b096-674d16b4ad00
slug: pharmacy
name: Apotheke
name_en: Pharmacy
name_localized: Pharmacy
icon: heart-pulse
color: null
kollektivvertrag: 'Pharmazeutischer Großhandel'
description: null
is_featured: false
parent_id: null
sort_order: 7
children: []
-
id: 019fd2b7-f388-7098-b463-ae170338e60f
slug: production
name: Produktion
name_en: Production
name_localized: Production
icon: industry
color: null
kollektivvertrag: Industrie
description: null
is_featured: false
parent_id: null
sort_order: 8
children: []
-
id: 019fd2b7-f38b-7209-8b83-b345b172def2
slug: warehouse
name: Lager
name_en: Warehouse
name_localized: Warehouse
icon: industry
color: null
kollektivvertrag: Industrie
description: null
is_featured: false
parent_id: null
sort_order: 9
children: []
-
id: 019fd2b7-f38e-7255-bfe3-0f010aca0086
slug: logistics
name: Logistik
name_en: Logistics
name_localized: Logistics
icon: truck
color: null
kollektivvertrag: Industrie
description: null
is_featured: true
parent_id: null
sort_order: 10
children: []
-
id: 019fd2b7-f391-727d-9871-61207ae27ab3
slug: manufacturing
name: Fertigung
name_en: Manufacturing
name_localized: Manufacturing
icon: industry
color: null
kollektivvertrag: Industrie
description: null
is_featured: false
parent_id: null
sort_order: 11
children: []
-
id: 019fd2b7-f394-7015-b80e-5fa954b27658
slug: transportation
name: Transport
name_en: Transportation
name_localized: Transportation
icon: truck
color: null
kollektivvertrag: Güterbeförderungsgewerbe
description: null
is_featured: false
parent_id: null
sort_order: 12
children: []
-
id: 019fd2b7-f398-7300-a216-c64584fea8f7
slug: event
name: Events
name_en: Events
name_localized: Events
icon: calendar-star
color: null
kollektivvertrag: Veranstaltungsdienstleistung
description: null
is_featured: false
parent_id: null
sort_order: 13
children: []
-
id: 019fd2b7-f39c-7064-8f21-15054bddd646
slug: security
name: Security
name_en: Security
name_localized: Security
icon: shield
color: null
kollektivvertrag: Bewachungsgewerbe
description: null
is_featured: false
parent_id: null
sort_order: 14
children: []
-
id: 019fd2b7-f39f-73e6-870b-fe7584e4f9bc
slug: office
name: Büro
name_en: Office
name_localized: Office
icon: briefcase
color: null
kollektivvertrag: Handel/Büro
description: null
is_featured: false
parent_id: null
sort_order: 15
children: []
-
id: 019fd2b7-f3a2-7147-883f-c3207db81b51
slug: reception
name: Empfang
name_en: Reception
name_localized: Reception
icon: briefcase
color: null
kollektivvertrag: Handel/Büro
description: null
is_featured: false
parent_id: null
sort_order: 16
children: []
-
id: 019fd2b7-f3a5-70a8-a3b1-9140f01abf8e
slug: call_center
name: 'Call Center'
name_en: 'Call Center'
name_localized: 'Call Center'
icon: briefcase
color: null
kollektivvertrag: Handel/Büro
description: null
is_featured: false
parent_id: null
sort_order: 17
children: []
-
id: 019fd2b7-f3a8-72f6-8ad1-0f499f6816e1
slug: customer_service
name: Kundenservice
name_en: 'Customer Service'
name_localized: 'Customer Service'
icon: briefcase
color: null
kollektivvertrag: Handel/Büro
description: null
is_featured: false
parent_id: null
sort_order: 18
children: []
-
id: 019fd2b7-f3ab-70a0-9523-b474e2007212
slug: software
name: Software
name_en: Software
name_localized: Software
icon: code
color: null
kollektivvertrag: IT-KV
description: null
is_featured: true
parent_id: null
sort_order: 19
children: []
-
id: 019fd2b7-f3c2-73b2-9873-51431d14404e
slug: it_services
name: 'IT Services'
name_en: 'IT Services'
name_localized: 'IT Services'
icon: code
color: null
kollektivvertrag: IT-KV
description: null
is_featured: false
parent_id: null
sort_order: 20
children: []
-
id: 019fd2b7-f3cc-728f-a1eb-11d5120b3dca
slug: cleaning
name: Reinigung
name_en: Cleaning
name_localized: Cleaning
icon: broom
color: null
kollektivvertrag: Gebäudereinigung
description: null
is_featured: false
parent_id: null
sort_order: 21
children: []
-
id: 019fd2b7-f3d1-72e1-a261-10207b6d759d
slug: facility
name: 'Facility Management'
name_en: 'Facility Management'
name_localized: 'Facility Management'
icon: broom
color: null
kollektivvertrag: Gebäudereinigung
description: null
is_featured: false
parent_id: null
sort_order: 22
children: []
-
id: 019fd2b7-f3d5-71b4-bece-4ea026852495
slug: care
name: Pflege/Betreuung
name_en: Care
name_localized: Care
icon: heart-pulse
color: null
kollektivvertrag: Sozialwirtschaft
description: null
is_featured: false
parent_id: null
sort_order: 23
children: []
-
id: 019fd2b7-f3d8-72d5-842e-c1f00337e9ec
slug: healthcare
name: Gesundheitswesen
name_en: Healthcare
name_localized: Healthcare
icon: heart-pulse
color: null
kollektivvertrag: Sozialwirtschaft
description: null
is_featured: false
parent_id: null
sort_order: 24
children: []
-
id: 019fd2b7-f3dc-70cb-a662-0fc23b0ec307
slug: construction
name: 'Bau (Hilfstätigkeiten)'
name_en: Construction
name_localized: Construction
icon: building
color: null
kollektivvertrag: Bauindustrie
description: null
is_featured: false
parent_id: null
sort_order: 25
children: []
-
id: 019fd2b7-f3df-70bb-8881-36c5f2234495
slug: real_estate
name: Immobilien
name_en: 'Real Estate'
name_localized: 'Real Estate'
icon: building
color: null
kollektivvertrag: Bauindustrie
description: null
is_featured: false
parent_id: null
sort_order: 26
children: []
-
id: 019fd2b7-f3e5-714f-8db2-a5ae4350ae5c
slug: graphic_design
name: Grafikdesign
name_en: 'Graphic Design'
name_localized: 'Graphic Design'
icon: palette
color: null
kollektivvertrag: Werbewirtschaft
description: null
is_featured: false
parent_id: null
sort_order: 27
children: []
-
id: 019fd2b7-f3e9-71c6-b382-7451adaf4bb7
slug: media
name: Medien
name_en: Media
name_localized: Media
icon: palette
color: null
kollektivvertrag: Werbewirtschaft
description: null
is_featured: true
parent_id: null
sort_order: 28
children: []
-
id: 019fd2b7-f3ec-717a-ac4d-13011f3096f1
slug: education
name: Bildung
name_en: Education
name_localized: Education
icon: graduation-cap
color: null
kollektivvertrag: Bildungseinrichtungen
description: null
is_featured: true
parent_id: null
sort_order: 29
children: []
-
id: 019fd2b7-f3f0-70a8-b7be-6be4c17c9429
slug: finance
name: Finanzen
name_en: Finance
name_localized: Finance
icon: chart-line
color: null
kollektivvertrag: 'Banken und Versicherungen'
description: null
is_featured: true
parent_id: null
sort_order: 30
children: []
-
id: 019fd2b7-f3f3-737d-9abe-5edb92ceb02a
slug: agriculture
name: Landwirtschaft
name_en: Agriculture
name_localized: Agriculture
icon: leaf
color: null
kollektivvertrag: 'Land- und Forstwirtschaft'
description: null
is_featured: false
parent_id: null
sort_order: 31
children: []
-
id: 019fd2b7-f3f6-70c7-868b-6ac419f0d02c
slug: other
name: Sonstiges
name_en: Other
name_localized: Other
icon: ellipsis
color: null
kollektivvertrag: Arbeitskräfteüberlasser
description: null
is_featured: false
parent_id: null
sort_order: 32
children: []
tags:
- 'Mobile API'
security: []
/api/v1/mobile/jobs:
get:
summary: 'List Available Jobs'
operationId: listAvailableJobs
description: "Returns available jobs with comprehensive filtering options.\nSupports location (state/radius), category, rate range, shift type, and sorting."
parameters:
-
in: query
name: category
description: 'Filter by job category slug, e.g. `gastro`.'
example: null
required: false
schema:
type: string
description: 'Filter by job category slug, e.g. `gastro`.'
examples:
- null
-
in: query
name: categories
description: 'Several category slugs, comma separated, e.g. `gastro,hotel`.'
example: null
required: false
schema:
type: array
description: 'Several category slugs, comma separated, e.g. `gastro,hotel`.'
items:
type: string
examples:
- null
-
in: query
name: state
description: 'Austrian state, e.g. `wien`.'
example: null
required: false
schema:
type: string
description: 'Austrian state, e.g. `wien`.'
examples:
- null
-
in: query
name: city
description: 'City name, e.g. `Wien`.'
example: null
required: false
schema:
type: string
description: 'City name, e.g. `Wien`.'
examples:
- null
-
in: query
name: lat
description: 'Latitude for a radius search; send with `lng` and `radius`.'
example: null
required: false
schema:
type: number
description: 'Latitude for a radius search; send with `lng` and `radius`.'
examples:
- null
-
in: query
name: lng
description: 'Longitude for a radius search.'
example: null
required: false
schema:
type: number
description: 'Longitude for a radius search.'
examples:
- null
-
in: query
name: radius
description: 'Radius in km around `lat`/`lng`.'
example: null
required: false
schema:
type: integer
description: 'Radius in km around `lat`/`lng`.'
examples:
- null
-
in: query
name: min_rate
description: 'Minimum gross hourly rate.'
example: null
required: false
schema:
type: number
description: 'Minimum gross hourly rate.'
examples:
- null
-
in: query
name: max_rate
description: 'Maximum gross hourly rate.'
example: null
required: false
schema:
type: number
description: 'Maximum gross hourly rate.'
examples:
- null
-
in: query
name: shift_type
description: 'One of day, night, evening.'
example: null
required: false
schema:
type: string
description: 'One of day, night, evening.'
examples:
- null
-
in: query
name: start_date
description: 'date Only jobs starting on or after this date.'
example: null
required: false
schema:
type: string
description: 'date Only jobs starting on or after this date.'
examples:
- null
-
in: query
name: end_date
description: 'date Only jobs starting on or before this date.'
example: null
required: false
schema:
type: string
description: 'date Only jobs starting on or before this date.'
examples:
- null
-
in: query
name: sort
description: 'Sort option.'
required: false
schema:
type: string
description: 'Sort option.'
examples:
- highest_salary
-
in: query
name: search
description: 'Free text over title and description.'
example: null
required: false
schema:
type: string
description: 'Free text over title and description.'
examples:
- null
-
in: query
name: exclude_applied
description: 'Exclude already applied jobs (default true).'
required: false
schema:
type: boolean
description: 'Exclude already applied jobs (default true).'
examples:
- true
-
in: query
name: per_page
description: 'Items per page (max 50).'
required: false
schema:
type: integer
description: 'Items per page (max 50).'
examples:
- 15
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
jobs:
type: array
items:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-28c4-732f-a94c-fb5a71a7d682
title:
type: string
examples:
- Accountant
description:
type: string
examples:
- 'Ut nostrum rerum ut alias quia libero excepturi. Voluptatum et aut non quia quisquam molestias. Perferendis qui hic unde.'
status:
type: string
examples:
- active
is_featured:
type: boolean
examples:
- false
category:
type: object
properties:
id:
type: string
examples:
- 019fd2b7-f39f-73e6-870b-fe7584e4f9bc
slug:
type: string
examples:
- office
name:
type: string
examples:
- Büro
name_localized:
type: string
examples:
- Office
icon:
type: string
examples:
- briefcase
color:
type:
- string
- 'null'
examples:
- null
tags:
type: array
items:
type: string
examples:
-
- Office
- Nachtschicht
organization:
type: object
properties:
id:
type: string
examples:
- 019fd2b7-f072-7154-8961-5b324cc6c46c
name:
type: string
examples:
- Caritas
logo_url:
type:
- string
- 'null'
examples:
- null
average_rating:
type:
- string
- 'null'
examples:
- null
location:
type: object
properties:
name:
type: string
examples:
- 'Barrows, Christiansen and Jones'
address:
type: string
examples:
- '586 Tremaine Row'
city:
type: string
examples:
- 'East Eliseo'
postal_code:
type: string
examples:
- 10547-3697
lat:
type: number
examples:
- 46.931383
lng:
type: number
examples:
- 11.998284
distance_km:
type:
- string
- 'null'
examples:
- null
schedule:
type: object
properties:
start_date:
type: string
examples:
- '2026-08-12'
end_date:
type: string
examples:
- '2026-08-19'
shift_start_time:
type: string
examples:
- '01:49:00'
shift_end_time:
type: string
examples:
- '18:57:00'
shift_type:
type: string
examples:
- night
shift_type_label:
type: string
examples:
- Nachtschicht
duration_hours:
type: number
examples:
- 17.133333333333
compensation:
type: object
properties:
hourly_rate_gross:
type: number
examples:
- 32.08
supplements:
type: object
properties:
night:
type: number
examples: [0.7]
weekend:
type: number
examples: [3.86]
estimated_total_gross:
type:
- string
- 'null'
examples:
- null
currency:
type: string
examples:
- EUR
vacancies:
type: object
properties:
total:
type: integer
examples:
- 5
filled:
type: integer
examples:
- 0
available:
type: integer
examples:
- 5
deadlines:
type: object
properties:
application:
type: string
examples:
- '2026-09-05T16:18:32+00:00'
created_at:
type: string
examples:
- '2026-08-05T16:18:32+00:00'
is_saved:
type: boolean
examples:
- false
can_apply:
type: boolean
examples:
- true
rate:
type:
- string
- 'null'
examples:
- null
examples:
-
-
id: 019fd2b8-28c4-732f-a94c-fb5a71a7d682
title: Accountant
description: 'Ut nostrum rerum ut alias quia libero excepturi. Voluptatum et aut non quia quisquam molestias. Perferendis qui hic unde.'
status: active
is_featured: false
category:
id: 019fd2b7-f39f-73e6-870b-fe7584e4f9bc
slug: office
name: Büro
name_localized: Office
icon: briefcase
color: null
tags:
- Office
- Nachtschicht
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
logo_url: null
average_rating: null
location:
name: 'Barrows, Christiansen and Jones'
address: '586 Tremaine Row'
city: 'East Eliseo'
postal_code: 10547-3697
lat: 46.931383
lng: 11.998284
distance_km: null
schedule:
start_date: '2026-08-12'
end_date: '2026-08-19'
shift_start_time: '01:49:00'
shift_end_time: '18:57:00'
shift_type: night
shift_type_label: Nachtschicht
duration_hours: 17.133333333333
compensation:
hourly_rate_gross: 32.08
supplements:
night: 0.7
weekend: 3.86
estimated_total_gross: null
currency: EUR
vacancies:
total: 5
filled: 0
available: 5
deadlines:
application: '2026-09-05T16:18:32+00:00'
created_at: '2026-08-05T16:18:32+00:00'
is_saved: false
can_apply: true
rate: null
-
id: 019fd2b8-1ccb-7322-8d33-448afd9b027b
title: 'Testingenieur Vertretung'
description: 'Wir suchen engagierte Testingenieur Vertretung zur Verstärkung unseres Teams. Sie erwartet ein abwechslungsreiches Aufgabengebiet in einem dynamischen Umfeld.'
status: active
is_featured: false
category:
id: 019fd2b7-f3c2-73b2-9873-51431d14404e
slug: it_services
name: 'IT Services'
name_localized: 'IT Services'
icon: code
color: null
tags:
- 'IT Services'
- Tagschicht
organization:
id: 019fd2b7-f842-71ba-a318-a919a24d4bcf
name: 'Hotel & Spa Imperial'
logo_url: null
average_rating: null
location:
name: 'BAWAG IT-Abteilung'
address: 'Wiesingerstraße 4, 1010 Wien'
city: Wien
postal_code: '1030'
lat: 48.2006
lng: 16.3882
distance_km: null
schedule:
start_date: '2026-08-15'
end_date: '2026-09-04'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 25
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 1
filled: 0
available: 1
deadlines:
application: '2026-08-12T16:18:26+00:00'
created_at: '2026-08-05T16:18:29+00:00'
is_saved: false
can_apply: true
rate: null
-
id: 019fd2b8-1405-709f-bca9-b0a418fb6a75
title: 'Silvesternacht Service'
description: 'Wir suchen motivierte Silvesternacht Service für unser engagiertes Team. Sie unterstützen uns bei der professionellen Gästebetreuung und sorgen für ein unvergessliches Erlebnis. Vorkenntnisse in der Gastronomie sind von Vorteil, aber nicht zwingend erforderlich.'
status: active
is_featured: false
category:
id: 019fd2b7-f371-732c-8cdb-6de13be42891
slug: gastro
name: Gastronomie
name_localized: Gastronomy
icon: utensils
color: null
tags:
- Gastronomy
- Nachtschicht
- 'HACCP Kenntnisse von Vorteil'
organization:
id: 019fd2b7-fe56-70d1-bb3a-641339ce636a
name: 'Lagerhaus Steiermark'
logo_url: null
average_rating: null
location:
name: 'Hotel Imperial Wien'
address: 'Kärntner Ring 16, 1015 Wien'
city: Wien
postal_code: '1010'
lat: 48.2082
lng: 16.3739
distance_km: null
schedule:
start_date: '2027-02-09'
end_date: '2027-02-10'
shift_start_time: '22:00:00'
shift_end_time: '06:00:00'
shift_type: night
shift_type_label: Nachtschicht
duration_hours: 8
compensation:
hourly_rate_gross: 25
supplements:
night_bonus: 50
holiday_bonus: 100
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 12
filled: 0
available: 12
deadlines:
application: '2027-02-04T16:18:26+00:00'
created_at: '2026-08-05T16:18:26+00:00'
is_saved: false
can_apply: true
rate: null
-
id: 019fd2b8-1cb9-72ec-bbe0-4f5f78a6a459
title: 'IT Helpdesk Mitarbeiter*in'
description: 'Für unser IT-Team suchen wir erfahrene IT Helpdesk Mitarbeiter*in. Sie unterstützen bei technischen Aufgaben, Systemwartung und Kundensupport.'
status: active
is_featured: false
category:
id: 019fd2b7-f3ab-70a0-9523-b474e2007212
slug: software
name: Software
name_localized: Software
icon: code
color: null
tags:
- Software
- Tagschicht
- IT-Grundkenntnisse
- 'Windows/Mac Erfahrung'
organization:
id: 019fd2b7-fbb4-73fa-b801-e0c8a8de2651
name: 'Bauwerk GmbH'
logo_url: null
average_rating: null
location:
name: 'Erste Bank IT'
address: 'Graben 21, 1010 Wien'
city: Wien
postal_code: '1010'
lat: 48.2082
lng: 16.3739
distance_km: null
schedule:
start_date: '2026-08-10'
end_date: '2026-11-03'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 22
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 2
filled: 0
available: 2
deadlines:
application: '2026-08-08T16:18:26+00:00'
created_at: '2026-08-05T16:18:29+00:00'
is_saved: false
can_apply: true
rate: null
-
id: 019fd2b8-1ce9-736a-9a61-22cea78283c9
title: 'Support-Techniker Außeneinsatz'
description: 'Wir suchen engagierte Support-Techniker Außeneinsatz zur Verstärkung unseres Teams. Sie erwartet ein abwechslungsreiches Aufgabengebiet in einem dynamischen Umfeld.'
status: active
is_featured: false
category:
id: 019fd2b7-f3c2-73b2-9873-51431d14404e
slug: it_services
name: 'IT Services'
name_localized: 'IT Services'
icon: code
color: null
tags:
- 'IT Services'
- Tagschicht
organization:
id: 019fd2b7-f91f-70cb-8409-8632db9df3c7
name: 'Sicherheitsdienst Österreich'
logo_url: null
average_rating: null
location:
name: 'IT Company Graz'
address: 'Münzgrabenstraße 10, 8010 Graz'
city: Graz
postal_code: '8020'
lat: 47.064
lng: 15.46
distance_km: null
schedule:
start_date: '2026-08-12'
end_date: '2026-10-04'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 20
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 2
filled: 0
available: 2
deadlines:
application: '2026-08-10T16:18:26+00:00'
created_at: '2026-08-05T16:18:29+00:00'
is_saved: false
can_apply: true
rate: null
-
id: 019fd2b8-1615-7120-9b3f-e0d90c1f57ef
title: 'Barkraft VIP-Lounge'
description: 'Für unsere bevorstehende Veranstaltung suchen wir tatkräftige Unterstützung. Als Barkraft VIP-Lounge sind Sie das Aushängeschild unserer Veranstaltung und sorgen für einen reibungslosen Ablauf.'
status: active
is_featured: false
category:
id: 019fd2b7-f398-7300-a216-c64584fea8f7
slug: event
name: Events
name_localized: Events
icon: calendar-star
color: null
tags:
- Events
- Tagschicht
organization:
id: 019fd2b7-fad7-719c-887a-a0f510bbd31d
name: 'IT Solutions GmbH'
logo_url: null
average_rating: null
location:
name: 'Salzburger Festspiele'
address: 'Hofstallgasse 1, 5020 Salzburg'
city: Salzburg
postal_code: '5020'
lat: 47.8095
lng: 13.055
distance_km: null
schedule:
start_date: '2026-10-24'
end_date: '2026-11-13'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 18
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 5
filled: 0
available: 5
deadlines:
application: '2026-10-21T16:18:26+00:00'
created_at: '2026-08-05T16:18:27+00:00'
is_saved: false
can_apply: true
rate: null
-
id: 019fd2b8-1d1e-7188-9438-b0d6050c492a
title: 'Kursleiter*in Deutschkurs'
description: 'Wir suchen engagierte Kursleiter*in Deutschkurs zur Verstärkung unseres Teams. Sie erwartet ein abwechslungsreiches Aufgabengebiet in einem dynamischen Umfeld.'
status: active
is_featured: false
category:
id: 019fd2b7-f3ec-717a-ac4d-13011f3096f1
slug: education
name: Bildung
name_localized: Education
icon: graduation-cap
color: null
tags:
- Education
- Tagschicht
organization:
id: 019fd2b8-00e8-7186-8fa6-5b042a30b10d
name: 'Transport & Spedition GmbH'
logo_url: null
average_rating: null
location:
name: 'VHS Wien'
address: 'Mariahilfer Straße 53, 1060 Wien'
city: Wien
postal_code: '1050'
lat: 48.1944
lng: 16.3585
distance_km: null
schedule:
start_date: '2026-08-12'
end_date: '2026-11-03'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 18
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 3
filled: 0
available: 3
deadlines:
application: '2026-08-09T16:18:26+00:00'
created_at: '2026-08-05T16:18:29+00:00'
is_saved: false
can_apply: true
rate: null
-
id: 019fd2b8-14dd-7377-92d2-447578550d00
title: 'Convention Coordinator'
description: 'Wir suchen engagierte Convention Coordinator zur Verstärkung unseres Teams. Sie erwartet ein abwechslungsreiches Aufgabengebiet in einem dynamischen Umfeld.'
status: active
is_featured: false
category:
id: 019fd2b7-f375-724e-84b8-4f9647ef6419
slug: hotel
name: Hotellerie
name_localized: Hospitality
icon: hotel
color: null
tags:
- Hospitality
- Tagschicht
organization:
id: 019fd2b8-000d-719b-a73e-71665713a4fc
name: 'Supermarkt AG'
logo_url: null
average_rating: null
location:
name: 'Austria Center Vienna'
address: 'Bruno-Kreisky-Platz 1, 1220 Wien'
city: Wien
postal_code: '1010'
lat: 48.2082
lng: 16.3739
distance_km: null
schedule:
start_date: '2026-08-25'
end_date: '2026-08-30'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 18
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 5
filled: 0
available: 5
deadlines:
application: '2026-08-23T16:18:26+00:00'
created_at: '2026-08-05T16:18:27+00:00'
is_saved: false
can_apply: true
rate: null
-
id: 019fd2b8-17b4-72f3-9ab2-f5a5a2902d4c
title: 'Staplerfahrer*in Zentrallager'
description: 'Wir suchen zuverlässige Staplerfahrer*in Zentrallager für unser Logistikzentrum. Sie unterstützen uns bei der Warenwirtschaft, Kommissionierung und dem allgemeinen Lagerbetrieb. Körperliche Belastbarkeit und Teamfähigkeit sind Voraussetzung.'
status: active
is_featured: false
category:
id: 019fd2b7-f38e-7255-bfe3-0f010aca0086
slug: logistics
name: Logistik
name_localized: Logistics
icon: truck
color: null
tags:
- Logistics
- Tagschicht
- 'Körperliche Belastbarkeit'
- 'Deutschkenntnisse Grundstufe'
organization:
id: 019fd2b7-f68e-713d-888b-ff71714f0874
name: 'Logistik Austria GmbH'
logo_url: null
average_rating: null
location:
name: 'REWE Lager Linz'
address: 'Industriestraße 3, 4030 Linz'
city: Linz
postal_code: '4030'
lat: 48.2757
lng: 14.3213
distance_km: null
schedule:
start_date: '2026-08-12'
end_date: '2027-02-01'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 16.5
supplements:
weekend_bonus: 8
forklift_license: true
estimated_total_gross: null
currency: EUR
vacancies:
total: 4
filled: 0
available: 4
deadlines:
application: '2026-08-07T16:18:26+00:00'
created_at: '2026-08-05T16:18:27+00:00'
is_saved: false
can_apply: true
rate: null
-
id: 019fd2b8-1d63-71f8-b82b-eb790b71f0b3
title: 'Produktionshelfer*in Fabrik'
description: 'Wir suchen engagierte Produktionshelfer*in Fabrik zur Verstärkung unseres Teams. Sie erwartet ein abwechslungsreiches Aufgabengebiet in einem dynamischen Umfeld.'
status: active
is_featured: false
category:
id: 019fd2b7-f388-7098-b463-ae170338e60f
slug: production
name: Produktion
name_localized: Production
icon: industry
color: null
tags:
- Production
- Tagschicht
organization:
id: 019fd2b7-f9fd-71a9-b71e-466dc30c8aac
name: 'Pflege & Betreuung GmbH'
logo_url: null
average_rating: null
location:
name: 'voestalpine Stahl GmbH'
address: 'voestalpine-Straße 1, 4020 Linz'
city: Linz
postal_code: '4030'
lat: 48.2757
lng: 14.3213
distance_km: null
schedule:
start_date: '2026-08-10'
end_date: '2026-11-03'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 16.5
supplements:
weekend_bonus: 8
shift_allowance: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 10
filled: 0
available: 10
deadlines:
application: '2026-08-07T16:18:26+00:00'
created_at: '2026-08-05T16:18:29+00:00'
is_saved: false
can_apply: true
rate: null
-
id: 019fd2b8-15d2-72e5-a3dc-cf69f63524e6
title: 'Technik Aufbau Konzert'
description: 'Für unsere bevorstehende Veranstaltung suchen wir tatkräftige Unterstützung. Als Technik Aufbau Konzert sind Sie das Aushängeschild unserer Veranstaltung und sorgen für einen reibungslosen Ablauf.'
status: active
is_featured: false
category:
id: 019fd2b7-f398-7300-a216-c64584fea8f7
slug: event
name: Events
name_localized: Events
icon: calendar-star
color: null
tags:
- Events
- Tagschicht
organization:
id: 019fd2b7-f91f-70cb-8409-8632db9df3c7
name: 'Sicherheitsdienst Österreich'
logo_url: null
average_rating: null
location:
name: 'Wiener Stadthalle'
address: 'Roland-Rainer-Platz 1, 1150 Wien'
city: Wien
postal_code: '1030'
lat: 48.1883
lng: 16.3957
distance_km: null
schedule:
start_date: '2026-08-10'
end_date: '2026-08-11'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 16
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 8
filled: 0
available: 8
deadlines:
application: '2026-08-07T16:18:26+00:00'
created_at: '2026-08-05T16:18:27+00:00'
is_saved: false
can_apply: true
rate: null
-
id: 019fd2b8-171e-7183-b2d6-b7fae57dd92b
title: 'Personenkontrolle Flughafen'
description: 'Als Personenkontrolle Flughafen sind Sie für die Sicherheit unserer Einrichtung/Veranstaltung verantwortlich. Sie überwachen Zugänge, kontrollieren Personen und sorgen für Ordnung und Sicherheit.'
status: active
is_featured: false
category:
id: 019fd2b7-f39c-7064-8f21-15054bddd646
slug: security
name: Security
name_localized: Security
icon: shield
color: null
tags:
- Security
- Tagschicht
- 'Sicherheitsausweis (§ 133 GewO)'
- Erste-Hilfe-Kurs
organization:
id: 019fd2b8-000d-719b-a73e-71665713a4fc
name: 'Supermarkt AG'
logo_url: null
average_rating: null
location:
name: 'Flughafen Wien-Schwechat'
address: 'Flughafen Wien, 1300 Wien'
city: Wien
postal_code: '1300'
lat: 48.1103
lng: 16.5697
distance_km: null
schedule:
start_date: '2026-08-10'
end_date: '2026-11-03'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 16
supplements:
weekend_bonus: 8
shift_allowance: 10
estimated_total_gross: null
currency: EUR
vacancies:
total: 6
filled: 0
available: 6
deadlines:
application: '2026-08-06T16:18:26+00:00'
created_at: '2026-08-05T16:18:27+00:00'
is_saved: false
can_apply: true
rate: null
-
id: 019fd2b8-1c02-7040-a155-5d35418e0953
title: 'Medizinische Sekretärin'
description: 'Wir suchen engagierte Medizinische Sekretärin zur Verstärkung unseres Teams. Sie erwartet ein abwechslungsreiches Aufgabengebiet in einem dynamischen Umfeld.'
status: active
is_featured: false
category:
id: 019fd2b7-f3d8-72d5-842e-c1f00337e9ec
slug: healthcare
name: Gesundheitswesen
name_localized: Healthcare
icon: heart-pulse
color: null
tags:
- Healthcare
- Tagschicht
- 'Medizinische Grundkenntnisse'
- Hygieneschulung
organization:
id: 019fd2b7-fca6-71cf-8683-c97f6f50a24a
name: 'Reinigungsservice Alpin'
logo_url: null
average_rating: null
location:
name: 'Ambulanz AKH Wien'
address: 'Währinger Gürtel 18-20, 1090 Wien'
city: Wien
postal_code: '1090'
lat: 48.2228
lng: 16.3568
distance_km: null
schedule:
start_date: '2026-08-12'
end_date: '2026-10-04'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 16
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 2
filled: 0
available: 2
deadlines:
application: '2026-08-07T16:18:26+00:00'
created_at: '2026-08-05T16:18:28+00:00'
is_saved: false
can_apply: true
rate: null
-
id: 019fd2b8-1547-703f-bfe4-177b0923bd1d
title: 'Concierge Nightshift'
description: 'Wir suchen engagierte Concierge Nightshift zur Verstärkung unseres Teams. Sie erwartet ein abwechslungsreiches Aufgabengebiet in einem dynamischen Umfeld.'
status: active
is_featured: false
category:
id: 019fd2b7-f375-724e-84b8-4f9647ef6419
slug: hotel
name: Hotellerie
name_localized: Hospitality
icon: hotel
color: null
tags:
- Hospitality
- Nachtschicht
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
logo_url: null
average_rating: null
location:
name: 'Grand Hotel Wien'
address: 'Kärntner Ring 9, 1010 Wien'
city: Wien
postal_code: '1010'
lat: 48.2082
lng: 16.3739
distance_km: null
schedule:
start_date: '2026-08-20'
end_date: '2027-08-05'
shift_start_time: '22:00:00'
shift_end_time: '06:00:00'
shift_type: night
shift_type_label: Nachtschicht
duration_hours: 8
compensation:
hourly_rate_gross: 16
supplements:
night_bonus: 20
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 1
filled: 0
available: 1
deadlines:
application: '2026-08-17T16:18:26+00:00'
created_at: '2026-08-05T16:18:27+00:00'
is_saved: false
can_apply: true
rate: null
-
id: 019fd2b8-1287-7146-a673-6798f3d03acc
title: 'Barkeeper Spätschicht Club'
description: 'Wir suchen motivierte Barkeeper Spätschicht Club für unser engagiertes Team. Sie unterstützen uns bei der professionellen Gästebetreuung und sorgen für ein unvergessliches Erlebnis. Vorkenntnisse in der Gastronomie sind von Vorteil, aber nicht zwingend erforderlich.'
status: active
is_featured: false
category:
id: 019fd2b7-f371-732c-8cdb-6de13be42891
slug: gastro
name: Gastronomie
name_localized: Gastronomy
icon: utensils
color: null
tags:
- Gastronomy
- Nachtschicht
- 'HACCP Kenntnisse von Vorteil'
organization:
id: 019fd2b7-f5ae-7390-a778-c08c8d56cdc0
name: 'Event Solutions Austria'
logo_url: null
average_rating: null
location:
name: 'Club Passage'
address: 'Babenbergerstraße 9, 1010 Wien'
city: Wien
postal_code: '1070'
lat: 48.2003
lng: 16.3465
distance_km: null
schedule:
start_date: '2026-08-08'
end_date: '2026-11-03'
shift_start_time: '22:00:00'
shift_end_time: '06:00:00'
shift_type: night
shift_type_label: Nachtschicht
duration_hours: 8
compensation:
hourly_rate_gross: 16
supplements:
night_bonus: 15
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 4
filled: 0
available: 4
deadlines:
application: '2026-08-06T16:18:26+00:00'
created_at: '2026-08-05T16:18:26+00:00'
is_saved: false
can_apply: true
rate: null
pagination:
type: object
properties:
current_page:
type: integer
examples:
- 1
last_page:
type: integer
examples:
- 5
per_page:
type: integer
examples:
- 15
total:
type: integer
examples:
- 71
examples:
-
status: SUCCESS
data:
jobs:
-
id: 019fd2b8-28c4-732f-a94c-fb5a71a7d682
title: Accountant
description: 'Ut nostrum rerum ut alias quia libero excepturi. Voluptatum et aut non quia quisquam molestias. Perferendis qui hic unde.'
status: active
is_featured: false
category:
id: 019fd2b7-f39f-73e6-870b-fe7584e4f9bc
slug: office
name: Büro
name_localized: Office
icon: briefcase
color: null
tags:
- Office
- Nachtschicht
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
logo_url: null
average_rating: null
location:
name: 'Barrows, Christiansen and Jones'
address: '586 Tremaine Row'
city: 'East Eliseo'
postal_code: 10547-3697
lat: 46.931383
lng: 11.998284
distance_km: null
schedule:
start_date: '2026-08-12'
end_date: '2026-08-19'
shift_start_time: '01:49:00'
shift_end_time: '18:57:00'
shift_type: night
shift_type_label: Nachtschicht
duration_hours: 17.133333333333
compensation:
hourly_rate_gross: 32.08
supplements:
night: 0.7
weekend: 3.86
estimated_total_gross: null
currency: EUR
vacancies:
total: 5
filled: 0
available: 5
deadlines:
application: '2026-09-05T16:18:32+00:00'
created_at: '2026-08-05T16:18:32+00:00'
is_saved: false
can_apply: true
rate: null
-
id: 019fd2b8-1ccb-7322-8d33-448afd9b027b
title: 'Testingenieur Vertretung'
description: 'Wir suchen engagierte Testingenieur Vertretung zur Verstärkung unseres Teams. Sie erwartet ein abwechslungsreiches Aufgabengebiet in einem dynamischen Umfeld.'
status: active
is_featured: false
category:
id: 019fd2b7-f3c2-73b2-9873-51431d14404e
slug: it_services
name: 'IT Services'
name_localized: 'IT Services'
icon: code
color: null
tags:
- 'IT Services'
- Tagschicht
organization:
id: 019fd2b7-f842-71ba-a318-a919a24d4bcf
name: 'Hotel & Spa Imperial'
logo_url: null
average_rating: null
location:
name: 'BAWAG IT-Abteilung'
address: 'Wiesingerstraße 4, 1010 Wien'
city: Wien
postal_code: '1030'
lat: 48.2006
lng: 16.3882
distance_km: null
schedule:
start_date: '2026-08-15'
end_date: '2026-09-04'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 25
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 1
filled: 0
available: 1
deadlines:
application: '2026-08-12T16:18:26+00:00'
created_at: '2026-08-05T16:18:29+00:00'
is_saved: false
can_apply: true
rate: null
-
id: 019fd2b8-1405-709f-bca9-b0a418fb6a75
title: 'Silvesternacht Service'
description: 'Wir suchen motivierte Silvesternacht Service für unser engagiertes Team. Sie unterstützen uns bei der professionellen Gästebetreuung und sorgen für ein unvergessliches Erlebnis. Vorkenntnisse in der Gastronomie sind von Vorteil, aber nicht zwingend erforderlich.'
status: active
is_featured: false
category:
id: 019fd2b7-f371-732c-8cdb-6de13be42891
slug: gastro
name: Gastronomie
name_localized: Gastronomy
icon: utensils
color: null
tags:
- Gastronomy
- Nachtschicht
- 'HACCP Kenntnisse von Vorteil'
organization:
id: 019fd2b7-fe56-70d1-bb3a-641339ce636a
name: 'Lagerhaus Steiermark'
logo_url: null
average_rating: null
location:
name: 'Hotel Imperial Wien'
address: 'Kärntner Ring 16, 1015 Wien'
city: Wien
postal_code: '1010'
lat: 48.2082
lng: 16.3739
distance_km: null
schedule:
start_date: '2027-02-09'
end_date: '2027-02-10'
shift_start_time: '22:00:00'
shift_end_time: '06:00:00'
shift_type: night
shift_type_label: Nachtschicht
duration_hours: 8
compensation:
hourly_rate_gross: 25
supplements:
night_bonus: 50
holiday_bonus: 100
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 12
filled: 0
available: 12
deadlines:
application: '2027-02-04T16:18:26+00:00'
created_at: '2026-08-05T16:18:26+00:00'
is_saved: false
can_apply: true
rate: null
-
id: 019fd2b8-1cb9-72ec-bbe0-4f5f78a6a459
title: 'IT Helpdesk Mitarbeiter*in'
description: 'Für unser IT-Team suchen wir erfahrene IT Helpdesk Mitarbeiter*in. Sie unterstützen bei technischen Aufgaben, Systemwartung und Kundensupport.'
status: active
is_featured: false
category:
id: 019fd2b7-f3ab-70a0-9523-b474e2007212
slug: software
name: Software
name_localized: Software
icon: code
color: null
tags:
- Software
- Tagschicht
- IT-Grundkenntnisse
- 'Windows/Mac Erfahrung'
organization:
id: 019fd2b7-fbb4-73fa-b801-e0c8a8de2651
name: 'Bauwerk GmbH'
logo_url: null
average_rating: null
location:
name: 'Erste Bank IT'
address: 'Graben 21, 1010 Wien'
city: Wien
postal_code: '1010'
lat: 48.2082
lng: 16.3739
distance_km: null
schedule:
start_date: '2026-08-10'
end_date: '2026-11-03'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 22
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 2
filled: 0
available: 2
deadlines:
application: '2026-08-08T16:18:26+00:00'
created_at: '2026-08-05T16:18:29+00:00'
is_saved: false
can_apply: true
rate: null
-
id: 019fd2b8-1ce9-736a-9a61-22cea78283c9
title: 'Support-Techniker Außeneinsatz'
description: 'Wir suchen engagierte Support-Techniker Außeneinsatz zur Verstärkung unseres Teams. Sie erwartet ein abwechslungsreiches Aufgabengebiet in einem dynamischen Umfeld.'
status: active
is_featured: false
category:
id: 019fd2b7-f3c2-73b2-9873-51431d14404e
slug: it_services
name: 'IT Services'
name_localized: 'IT Services'
icon: code
color: null
tags:
- 'IT Services'
- Tagschicht
organization:
id: 019fd2b7-f91f-70cb-8409-8632db9df3c7
name: 'Sicherheitsdienst Österreich'
logo_url: null
average_rating: null
location:
name: 'IT Company Graz'
address: 'Münzgrabenstraße 10, 8010 Graz'
city: Graz
postal_code: '8020'
lat: 47.064
lng: 15.46
distance_km: null
schedule:
start_date: '2026-08-12'
end_date: '2026-10-04'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 20
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 2
filled: 0
available: 2
deadlines:
application: '2026-08-10T16:18:26+00:00'
created_at: '2026-08-05T16:18:29+00:00'
is_saved: false
can_apply: true
rate: null
-
id: 019fd2b8-1615-7120-9b3f-e0d90c1f57ef
title: 'Barkraft VIP-Lounge'
description: 'Für unsere bevorstehende Veranstaltung suchen wir tatkräftige Unterstützung. Als Barkraft VIP-Lounge sind Sie das Aushängeschild unserer Veranstaltung und sorgen für einen reibungslosen Ablauf.'
status: active
is_featured: false
category:
id: 019fd2b7-f398-7300-a216-c64584fea8f7
slug: event
name: Events
name_localized: Events
icon: calendar-star
color: null
tags:
- Events
- Tagschicht
organization:
id: 019fd2b7-fad7-719c-887a-a0f510bbd31d
name: 'IT Solutions GmbH'
logo_url: null
average_rating: null
location:
name: 'Salzburger Festspiele'
address: 'Hofstallgasse 1, 5020 Salzburg'
city: Salzburg
postal_code: '5020'
lat: 47.8095
lng: 13.055
distance_km: null
schedule:
start_date: '2026-10-24'
end_date: '2026-11-13'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 18
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 5
filled: 0
available: 5
deadlines:
application: '2026-10-21T16:18:26+00:00'
created_at: '2026-08-05T16:18:27+00:00'
is_saved: false
can_apply: true
rate: null
-
id: 019fd2b8-1d1e-7188-9438-b0d6050c492a
title: 'Kursleiter*in Deutschkurs'
description: 'Wir suchen engagierte Kursleiter*in Deutschkurs zur Verstärkung unseres Teams. Sie erwartet ein abwechslungsreiches Aufgabengebiet in einem dynamischen Umfeld.'
status: active
is_featured: false
category:
id: 019fd2b7-f3ec-717a-ac4d-13011f3096f1
slug: education
name: Bildung
name_localized: Education
icon: graduation-cap
color: null
tags:
- Education
- Tagschicht
organization:
id: 019fd2b8-00e8-7186-8fa6-5b042a30b10d
name: 'Transport & Spedition GmbH'
logo_url: null
average_rating: null
location:
name: 'VHS Wien'
address: 'Mariahilfer Straße 53, 1060 Wien'
city: Wien
postal_code: '1050'
lat: 48.1944
lng: 16.3585
distance_km: null
schedule:
start_date: '2026-08-12'
end_date: '2026-11-03'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 18
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 3
filled: 0
available: 3
deadlines:
application: '2026-08-09T16:18:26+00:00'
created_at: '2026-08-05T16:18:29+00:00'
is_saved: false
can_apply: true
rate: null
-
id: 019fd2b8-14dd-7377-92d2-447578550d00
title: 'Convention Coordinator'
description: 'Wir suchen engagierte Convention Coordinator zur Verstärkung unseres Teams. Sie erwartet ein abwechslungsreiches Aufgabengebiet in einem dynamischen Umfeld.'
status: active
is_featured: false
category:
id: 019fd2b7-f375-724e-84b8-4f9647ef6419
slug: hotel
name: Hotellerie
name_localized: Hospitality
icon: hotel
color: null
tags:
- Hospitality
- Tagschicht
organization:
id: 019fd2b8-000d-719b-a73e-71665713a4fc
name: 'Supermarkt AG'
logo_url: null
average_rating: null
location:
name: 'Austria Center Vienna'
address: 'Bruno-Kreisky-Platz 1, 1220 Wien'
city: Wien
postal_code: '1010'
lat: 48.2082
lng: 16.3739
distance_km: null
schedule:
start_date: '2026-08-25'
end_date: '2026-08-30'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 18
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 5
filled: 0
available: 5
deadlines:
application: '2026-08-23T16:18:26+00:00'
created_at: '2026-08-05T16:18:27+00:00'
is_saved: false
can_apply: true
rate: null
-
id: 019fd2b8-17b4-72f3-9ab2-f5a5a2902d4c
title: 'Staplerfahrer*in Zentrallager'
description: 'Wir suchen zuverlässige Staplerfahrer*in Zentrallager für unser Logistikzentrum. Sie unterstützen uns bei der Warenwirtschaft, Kommissionierung und dem allgemeinen Lagerbetrieb. Körperliche Belastbarkeit und Teamfähigkeit sind Voraussetzung.'
status: active
is_featured: false
category:
id: 019fd2b7-f38e-7255-bfe3-0f010aca0086
slug: logistics
name: Logistik
name_localized: Logistics
icon: truck
color: null
tags:
- Logistics
- Tagschicht
- 'Körperliche Belastbarkeit'
- 'Deutschkenntnisse Grundstufe'
organization:
id: 019fd2b7-f68e-713d-888b-ff71714f0874
name: 'Logistik Austria GmbH'
logo_url: null
average_rating: null
location:
name: 'REWE Lager Linz'
address: 'Industriestraße 3, 4030 Linz'
city: Linz
postal_code: '4030'
lat: 48.2757
lng: 14.3213
distance_km: null
schedule:
start_date: '2026-08-12'
end_date: '2027-02-01'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 16.5
supplements:
weekend_bonus: 8
forklift_license: true
estimated_total_gross: null
currency: EUR
vacancies:
total: 4
filled: 0
available: 4
deadlines:
application: '2026-08-07T16:18:26+00:00'
created_at: '2026-08-05T16:18:27+00:00'
is_saved: false
can_apply: true
rate: null
-
id: 019fd2b8-1d63-71f8-b82b-eb790b71f0b3
title: 'Produktionshelfer*in Fabrik'
description: 'Wir suchen engagierte Produktionshelfer*in Fabrik zur Verstärkung unseres Teams. Sie erwartet ein abwechslungsreiches Aufgabengebiet in einem dynamischen Umfeld.'
status: active
is_featured: false
category:
id: 019fd2b7-f388-7098-b463-ae170338e60f
slug: production
name: Produktion
name_localized: Production
icon: industry
color: null
tags:
- Production
- Tagschicht
organization:
id: 019fd2b7-f9fd-71a9-b71e-466dc30c8aac
name: 'Pflege & Betreuung GmbH'
logo_url: null
average_rating: null
location:
name: 'voestalpine Stahl GmbH'
address: 'voestalpine-Straße 1, 4020 Linz'
city: Linz
postal_code: '4030'
lat: 48.2757
lng: 14.3213
distance_km: null
schedule:
start_date: '2026-08-10'
end_date: '2026-11-03'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 16.5
supplements:
weekend_bonus: 8
shift_allowance: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 10
filled: 0
available: 10
deadlines:
application: '2026-08-07T16:18:26+00:00'
created_at: '2026-08-05T16:18:29+00:00'
is_saved: false
can_apply: true
rate: null
-
id: 019fd2b8-15d2-72e5-a3dc-cf69f63524e6
title: 'Technik Aufbau Konzert'
description: 'Für unsere bevorstehende Veranstaltung suchen wir tatkräftige Unterstützung. Als Technik Aufbau Konzert sind Sie das Aushängeschild unserer Veranstaltung und sorgen für einen reibungslosen Ablauf.'
status: active
is_featured: false
category:
id: 019fd2b7-f398-7300-a216-c64584fea8f7
slug: event
name: Events
name_localized: Events
icon: calendar-star
color: null
tags:
- Events
- Tagschicht
organization:
id: 019fd2b7-f91f-70cb-8409-8632db9df3c7
name: 'Sicherheitsdienst Österreich'
logo_url: null
average_rating: null
location:
name: 'Wiener Stadthalle'
address: 'Roland-Rainer-Platz 1, 1150 Wien'
city: Wien
postal_code: '1030'
lat: 48.1883
lng: 16.3957
distance_km: null
schedule:
start_date: '2026-08-10'
end_date: '2026-08-11'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 16
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 8
filled: 0
available: 8
deadlines:
application: '2026-08-07T16:18:26+00:00'
created_at: '2026-08-05T16:18:27+00:00'
is_saved: false
can_apply: true
rate: null
-
id: 019fd2b8-171e-7183-b2d6-b7fae57dd92b
title: 'Personenkontrolle Flughafen'
description: 'Als Personenkontrolle Flughafen sind Sie für die Sicherheit unserer Einrichtung/Veranstaltung verantwortlich. Sie überwachen Zugänge, kontrollieren Personen und sorgen für Ordnung und Sicherheit.'
status: active
is_featured: false
category:
id: 019fd2b7-f39c-7064-8f21-15054bddd646
slug: security
name: Security
name_localized: Security
icon: shield
color: null
tags:
- Security
- Tagschicht
- 'Sicherheitsausweis (§ 133 GewO)'
- Erste-Hilfe-Kurs
organization:
id: 019fd2b8-000d-719b-a73e-71665713a4fc
name: 'Supermarkt AG'
logo_url: null
average_rating: null
location:
name: 'Flughafen Wien-Schwechat'
address: 'Flughafen Wien, 1300 Wien'
city: Wien
postal_code: '1300'
lat: 48.1103
lng: 16.5697
distance_km: null
schedule:
start_date: '2026-08-10'
end_date: '2026-11-03'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 16
supplements:
weekend_bonus: 8
shift_allowance: 10
estimated_total_gross: null
currency: EUR
vacancies:
total: 6
filled: 0
available: 6
deadlines:
application: '2026-08-06T16:18:26+00:00'
created_at: '2026-08-05T16:18:27+00:00'
is_saved: false
can_apply: true
rate: null
-
id: 019fd2b8-1c02-7040-a155-5d35418e0953
title: 'Medizinische Sekretärin'
description: 'Wir suchen engagierte Medizinische Sekretärin zur Verstärkung unseres Teams. Sie erwartet ein abwechslungsreiches Aufgabengebiet in einem dynamischen Umfeld.'
status: active
is_featured: false
category:
id: 019fd2b7-f3d8-72d5-842e-c1f00337e9ec
slug: healthcare
name: Gesundheitswesen
name_localized: Healthcare
icon: heart-pulse
color: null
tags:
- Healthcare
- Tagschicht
- 'Medizinische Grundkenntnisse'
- Hygieneschulung
organization:
id: 019fd2b7-fca6-71cf-8683-c97f6f50a24a
name: 'Reinigungsservice Alpin'
logo_url: null
average_rating: null
location:
name: 'Ambulanz AKH Wien'
address: 'Währinger Gürtel 18-20, 1090 Wien'
city: Wien
postal_code: '1090'
lat: 48.2228
lng: 16.3568
distance_km: null
schedule:
start_date: '2026-08-12'
end_date: '2026-10-04'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 16
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 2
filled: 0
available: 2
deadlines:
application: '2026-08-07T16:18:26+00:00'
created_at: '2026-08-05T16:18:28+00:00'
is_saved: false
can_apply: true
rate: null
-
id: 019fd2b8-1547-703f-bfe4-177b0923bd1d
title: 'Concierge Nightshift'
description: 'Wir suchen engagierte Concierge Nightshift zur Verstärkung unseres Teams. Sie erwartet ein abwechslungsreiches Aufgabengebiet in einem dynamischen Umfeld.'
status: active
is_featured: false
category:
id: 019fd2b7-f375-724e-84b8-4f9647ef6419
slug: hotel
name: Hotellerie
name_localized: Hospitality
icon: hotel
color: null
tags:
- Hospitality
- Nachtschicht
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
logo_url: null
average_rating: null
location:
name: 'Grand Hotel Wien'
address: 'Kärntner Ring 9, 1010 Wien'
city: Wien
postal_code: '1010'
lat: 48.2082
lng: 16.3739
distance_km: null
schedule:
start_date: '2026-08-20'
end_date: '2027-08-05'
shift_start_time: '22:00:00'
shift_end_time: '06:00:00'
shift_type: night
shift_type_label: Nachtschicht
duration_hours: 8
compensation:
hourly_rate_gross: 16
supplements:
night_bonus: 20
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 1
filled: 0
available: 1
deadlines:
application: '2026-08-17T16:18:26+00:00'
created_at: '2026-08-05T16:18:27+00:00'
is_saved: false
can_apply: true
rate: null
-
id: 019fd2b8-1287-7146-a673-6798f3d03acc
title: 'Barkeeper Spätschicht Club'
description: 'Wir suchen motivierte Barkeeper Spätschicht Club für unser engagiertes Team. Sie unterstützen uns bei der professionellen Gästebetreuung und sorgen für ein unvergessliches Erlebnis. Vorkenntnisse in der Gastronomie sind von Vorteil, aber nicht zwingend erforderlich.'
status: active
is_featured: false
category:
id: 019fd2b7-f371-732c-8cdb-6de13be42891
slug: gastro
name: Gastronomie
name_localized: Gastronomy
icon: utensils
color: null
tags:
- Gastronomy
- Nachtschicht
- 'HACCP Kenntnisse von Vorteil'
organization:
id: 019fd2b7-f5ae-7390-a778-c08c8d56cdc0
name: 'Event Solutions Austria'
logo_url: null
average_rating: null
location:
name: 'Club Passage'
address: 'Babenbergerstraße 9, 1010 Wien'
city: Wien
postal_code: '1070'
lat: 48.2003
lng: 16.3465
distance_km: null
schedule:
start_date: '2026-08-08'
end_date: '2026-11-03'
shift_start_time: '22:00:00'
shift_end_time: '06:00:00'
shift_type: night
shift_type_label: Nachtschicht
duration_hours: 8
compensation:
hourly_rate_gross: 16
supplements:
night_bonus: 15
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 4
filled: 0
available: 4
deadlines:
application: '2026-08-06T16:18:26+00:00'
created_at: '2026-08-05T16:18:26+00:00'
is_saved: false
can_apply: true
rate: null
pagination:
current_page: 1
last_page: 5
per_page: 15
total: 71
tags:
- 'Mobile API'
security: []
/api/v1/mobile/jobs/filters:
get:
summary: 'Get Job Filters'
operationId: getJobFilters
description: "Returns all available filter options for the job listing screen.\nThis endpoint is designed to be called **once per session** (on app start or\nwhen opening the filter sheet) and cached client-side.\n\nIncludes live job counts per category and the actual hourly-rate range from\ncurrently active jobs so the Flutter slider is always bounded correctly.\n\nResponse is cacheable for 1 hour (`Cache-Control: public, max-age=3600`)."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
categories:
type: array
items:
type: object
properties:
id:
type: string
examples:
- 019fd2b7-f371-732c-8cdb-6de13be42891
slug:
type: string
examples:
- gastro
name:
type: string
examples:
- Gastronomie
name_localized:
type: string
examples:
- Gastronomy
icon:
type: string
examples:
- utensils
is_featured:
type: boolean
examples:
- true
parent_id:
type:
- string
- 'null'
examples:
- null
job_count:
type: integer
examples:
- 13
examples:
-
-
id: 019fd2b7-f371-732c-8cdb-6de13be42891
slug: gastro
name: Gastronomie
name_localized: Gastronomy
icon: utensils
is_featured: true
parent_id: null
job_count: 13
-
id: 019fd2b7-f375-724e-84b8-4f9647ef6419
slug: hotel
name: Hotellerie
name_localized: Hospitality
icon: hotel
is_featured: true
parent_id: null
job_count: 5
-
id: 019fd2b7-f377-7108-8400-efa89715a39f
slug: food_service
name: 'Food Service'
name_localized: 'Food Service'
icon: utensils
is_featured: false
parent_id: null
job_count: 0
-
id: 019fd2b7-f37a-72a9-84a9-7862f636e2fd
slug: catering
name: Catering
name_localized: Catering
icon: utensils
is_featured: false
parent_id: null
job_count: 4
-
id: 019fd2b7-f37d-712d-92b3-aa5540f6b2a7
slug: retail
name: Einzelhandel
name_localized: Retail
icon: shopping-cart
is_featured: false
parent_id: null
job_count: 4
-
id: 019fd2b7-f380-7300-91c6-75c968e6d045
slug: supermarket
name: Lebensmittelhandel
name_localized: Grocery
icon: shopping-cart
is_featured: false
parent_id: null
job_count: 2
-
id: 019fd2b7-f384-7071-b096-674d16b4ad00
slug: pharmacy
name: Apotheke
name_localized: Pharmacy
icon: heart-pulse
is_featured: false
parent_id: null
job_count: 0
-
id: 019fd2b7-f388-7098-b463-ae170338e60f
slug: production
name: Produktion
name_localized: Production
icon: industry
is_featured: false
parent_id: null
job_count: 2
-
id: 019fd2b7-f38b-7209-8b83-b345b172def2
slug: warehouse
name: Lager
name_localized: Warehouse
icon: industry
is_featured: false
parent_id: null
job_count: 0
-
id: 019fd2b7-f38e-7255-bfe3-0f010aca0086
slug: logistics
name: Logistik
name_localized: Logistics
icon: truck
is_featured: true
parent_id: null
job_count: 5
-
id: 019fd2b7-f391-727d-9871-61207ae27ab3
slug: manufacturing
name: Fertigung
name_localized: Manufacturing
icon: industry
is_featured: false
parent_id: null
job_count: 1
-
id: 019fd2b7-f394-7015-b80e-5fa954b27658
slug: transportation
name: Transport
name_localized: Transportation
icon: truck
is_featured: false
parent_id: null
job_count: 0
-
id: 019fd2b7-f398-7300-a216-c64584fea8f7
slug: event
name: Events
name_localized: Events
icon: calendar-star
is_featured: false
parent_id: null
job_count: 13
-
id: 019fd2b7-f39c-7064-8f21-15054bddd646
slug: security
name: Security
name_localized: Security
icon: shield
is_featured: false
parent_id: null
job_count: 5
-
id: 019fd2b7-f39f-73e6-870b-fe7584e4f9bc
slug: office
name: Büro
name_localized: Office
icon: briefcase
is_featured: false
parent_id: null
job_count: 2
-
id: 019fd2b7-f3a2-7147-883f-c3207db81b51
slug: reception
name: Empfang
name_localized: Reception
icon: briefcase
is_featured: false
parent_id: null
job_count: 1
-
id: 019fd2b7-f3a5-70a8-a3b1-9140f01abf8e
slug: call_center
name: 'Call Center'
name_localized: 'Call Center'
icon: briefcase
is_featured: false
parent_id: null
job_count: 0
-
id: 019fd2b7-f3a8-72f6-8ad1-0f499f6816e1
slug: customer_service
name: Kundenservice
name_localized: 'Customer Service'
icon: briefcase
is_featured: false
parent_id: null
job_count: 1
-
id: 019fd2b7-f3ab-70a0-9523-b474e2007212
slug: software
name: Software
name_localized: Software
icon: code
is_featured: true
parent_id: null
job_count: 1
-
id: 019fd2b7-f3c2-73b2-9873-51431d14404e
slug: it_services
name: 'IT Services'
name_localized: 'IT Services'
icon: code
is_featured: false
parent_id: null
job_count: 2
-
id: 019fd2b7-f3cc-728f-a1eb-11d5120b3dca
slug: cleaning
name: Reinigung
name_localized: Cleaning
icon: broom
is_featured: false
parent_id: null
job_count: 3
-
id: 019fd2b7-f3d1-72e1-a261-10207b6d759d
slug: facility
name: 'Facility Management'
name_localized: 'Facility Management'
icon: broom
is_featured: false
parent_id: null
job_count: 0
-
id: 019fd2b7-f3d5-71b4-bece-4ea026852495
slug: care
name: Pflege/Betreuung
name_localized: Care
icon: heart-pulse
is_featured: false
parent_id: null
job_count: 1
-
id: 019fd2b7-f3d8-72d5-842e-c1f00337e9ec
slug: healthcare
name: Gesundheitswesen
name_localized: Healthcare
icon: heart-pulse
is_featured: false
parent_id: null
job_count: 2
-
id: 019fd2b7-f3dc-70cb-a662-0fc23b0ec307
slug: construction
name: 'Bau (Hilfstätigkeiten)'
name_localized: Construction
icon: building
is_featured: false
parent_id: null
job_count: 2
-
id: 019fd2b7-f3df-70bb-8881-36c5f2234495
slug: real_estate
name: Immobilien
name_localized: 'Real Estate'
icon: building
is_featured: false
parent_id: null
job_count: 0
-
id: 019fd2b7-f3e5-714f-8db2-a5ae4350ae5c
slug: graphic_design
name: Grafikdesign
name_localized: 'Graphic Design'
icon: palette
is_featured: false
parent_id: null
job_count: 0
-
id: 019fd2b7-f3e9-71c6-b382-7451adaf4bb7
slug: media
name: Medien
name_localized: Media
icon: palette
is_featured: true
parent_id: null
job_count: 0
-
id: 019fd2b7-f3ec-717a-ac4d-13011f3096f1
slug: education
name: Bildung
name_localized: Education
icon: graduation-cap
is_featured: true
parent_id: null
job_count: 2
-
id: 019fd2b7-f3f0-70a8-b7be-6be4c17c9429
slug: finance
name: Finanzen
name_localized: Finance
icon: chart-line
is_featured: true
parent_id: null
job_count: 0
-
id: 019fd2b7-f3f3-737d-9abe-5edb92ceb02a
slug: agriculture
name: Landwirtschaft
name_localized: Agriculture
icon: leaf
is_featured: false
parent_id: null
job_count: 0
-
id: 019fd2b7-f3f6-70c7-868b-6ac419f0d02c
slug: other
name: Sonstiges
name_localized: Other
icon: ellipsis
is_featured: false
parent_id: null
job_count: 0
categories_grouped:
type: object
properties:
Gastronomie:
type: array
examples:
- []
Hotellerie:
type: array
examples:
- []
'Food Service':
type: array
examples:
- []
Catering:
type: array
examples:
- []
Einzelhandel:
type: array
examples:
- []
Lebensmittelhandel:
type: array
examples:
- []
Apotheke:
type: array
examples:
- []
Produktion:
type: array
examples:
- []
Lager:
type: array
examples:
- []
Logistik:
type: array
examples:
- []
Fertigung:
type: array
examples:
- []
Transport:
type: array
examples:
- []
Events:
type: array
examples:
- []
Security:
type: array
examples:
- []
Büro:
type: array
examples:
- []
Empfang:
type: array
examples:
- []
'Call Center':
type: array
examples:
- []
Kundenservice:
type: array
examples:
- []
Software:
type: array
examples:
- []
'IT Services':
type: array
examples:
- []
Reinigung:
type: array
examples:
- []
'Facility Management':
type: array
examples:
- []
Pflege/Betreuung:
type: array
examples:
- []
Gesundheitswesen:
type: array
examples:
- []
'Bau (Hilfstätigkeiten)':
type: array
examples:
- []
Immobilien:
type: array
examples:
- []
Grafikdesign:
type: array
examples:
- []
Medien:
type: array
examples:
- []
Bildung:
type: array
examples:
- []
Finanzen:
type: array
examples:
- []
Landwirtschaft:
type: array
examples:
- []
Sonstiges:
type: array
examples:
- []
states:
type: array
items:
type: object
properties:
value:
type: string
examples:
- wien
label:
type: string
examples:
- Wien
examples:
-
-
value: wien
label: Wien
-
value: niederoesterreich
label: Niederösterreich
-
value: oberoesterreich
label: Oberösterreich
-
value: steiermark
label: Steiermark
-
value: salzburg
label: Salzburg
-
value: tirol
label: Tirol
-
value: vorarlberg
label: Vorarlberg
-
value: kaernten
label: Kärnten
-
value: burgenland
label: Burgenland
sort_options:
type: array
items:
type: object
properties:
value:
type: string
examples:
- newest
label:
type: string
examples:
- Neueste
examples:
-
-
value: newest
label: Neueste
-
value: highest_salary
label: 'Höchstes Gehalt'
-
value: lowest_salary
label: 'Niedrigstes Gehalt'
-
value: nearest
label: Nächstgelegen
-
value: starting_soon
label: 'Bald startend'
-
value: morning_shifts
label: Morgenschichten
-
value: night_shifts
label: Nachtschichten
-
value: featured
label: Empfohlen
-
value: relevance
label: Relevanz
shift_types:
type: array
items:
type: object
properties:
value:
type: string
examples:
- day
label:
type: string
examples:
- Tagschicht
examples:
-
-
value: day
label: Tagschicht
-
value: night
label: Nachtschicht
-
value: weekend
label: Wochenendschicht
-
value: holiday
label: Feiertagsschicht
rate_range:
type: object
properties:
min:
type: integer
examples:
- 10
max:
type: integer
examples:
- 100
step:
type: number
examples:
- 0.5
active_min:
type: integer
examples:
- 13
active_max:
type: number
examples:
- 32.08
examples:
-
status: SUCCESS
data:
categories:
-
id: 019fd2b7-f371-732c-8cdb-6de13be42891
slug: gastro
name: Gastronomie
name_localized: Gastronomy
icon: utensils
is_featured: true
parent_id: null
job_count: 13
-
id: 019fd2b7-f375-724e-84b8-4f9647ef6419
slug: hotel
name: Hotellerie
name_localized: Hospitality
icon: hotel
is_featured: true
parent_id: null
job_count: 5
-
id: 019fd2b7-f377-7108-8400-efa89715a39f
slug: food_service
name: 'Food Service'
name_localized: 'Food Service'
icon: utensils
is_featured: false
parent_id: null
job_count: 0
-
id: 019fd2b7-f37a-72a9-84a9-7862f636e2fd
slug: catering
name: Catering
name_localized: Catering
icon: utensils
is_featured: false
parent_id: null
job_count: 4
-
id: 019fd2b7-f37d-712d-92b3-aa5540f6b2a7
slug: retail
name: Einzelhandel
name_localized: Retail
icon: shopping-cart
is_featured: false
parent_id: null
job_count: 4
-
id: 019fd2b7-f380-7300-91c6-75c968e6d045
slug: supermarket
name: Lebensmittelhandel
name_localized: Grocery
icon: shopping-cart
is_featured: false
parent_id: null
job_count: 2
-
id: 019fd2b7-f384-7071-b096-674d16b4ad00
slug: pharmacy
name: Apotheke
name_localized: Pharmacy
icon: heart-pulse
is_featured: false
parent_id: null
job_count: 0
-
id: 019fd2b7-f388-7098-b463-ae170338e60f
slug: production
name: Produktion
name_localized: Production
icon: industry
is_featured: false
parent_id: null
job_count: 2
-
id: 019fd2b7-f38b-7209-8b83-b345b172def2
slug: warehouse
name: Lager
name_localized: Warehouse
icon: industry
is_featured: false
parent_id: null
job_count: 0
-
id: 019fd2b7-f38e-7255-bfe3-0f010aca0086
slug: logistics
name: Logistik
name_localized: Logistics
icon: truck
is_featured: true
parent_id: null
job_count: 5
-
id: 019fd2b7-f391-727d-9871-61207ae27ab3
slug: manufacturing
name: Fertigung
name_localized: Manufacturing
icon: industry
is_featured: false
parent_id: null
job_count: 1
-
id: 019fd2b7-f394-7015-b80e-5fa954b27658
slug: transportation
name: Transport
name_localized: Transportation
icon: truck
is_featured: false
parent_id: null
job_count: 0
-
id: 019fd2b7-f398-7300-a216-c64584fea8f7
slug: event
name: Events
name_localized: Events
icon: calendar-star
is_featured: false
parent_id: null
job_count: 13
-
id: 019fd2b7-f39c-7064-8f21-15054bddd646
slug: security
name: Security
name_localized: Security
icon: shield
is_featured: false
parent_id: null
job_count: 5
-
id: 019fd2b7-f39f-73e6-870b-fe7584e4f9bc
slug: office
name: Büro
name_localized: Office
icon: briefcase
is_featured: false
parent_id: null
job_count: 2
-
id: 019fd2b7-f3a2-7147-883f-c3207db81b51
slug: reception
name: Empfang
name_localized: Reception
icon: briefcase
is_featured: false
parent_id: null
job_count: 1
-
id: 019fd2b7-f3a5-70a8-a3b1-9140f01abf8e
slug: call_center
name: 'Call Center'
name_localized: 'Call Center'
icon: briefcase
is_featured: false
parent_id: null
job_count: 0
-
id: 019fd2b7-f3a8-72f6-8ad1-0f499f6816e1
slug: customer_service
name: Kundenservice
name_localized: 'Customer Service'
icon: briefcase
is_featured: false
parent_id: null
job_count: 1
-
id: 019fd2b7-f3ab-70a0-9523-b474e2007212
slug: software
name: Software
name_localized: Software
icon: code
is_featured: true
parent_id: null
job_count: 1
-
id: 019fd2b7-f3c2-73b2-9873-51431d14404e
slug: it_services
name: 'IT Services'
name_localized: 'IT Services'
icon: code
is_featured: false
parent_id: null
job_count: 2
-
id: 019fd2b7-f3cc-728f-a1eb-11d5120b3dca
slug: cleaning
name: Reinigung
name_localized: Cleaning
icon: broom
is_featured: false
parent_id: null
job_count: 3
-
id: 019fd2b7-f3d1-72e1-a261-10207b6d759d
slug: facility
name: 'Facility Management'
name_localized: 'Facility Management'
icon: broom
is_featured: false
parent_id: null
job_count: 0
-
id: 019fd2b7-f3d5-71b4-bece-4ea026852495
slug: care
name: Pflege/Betreuung
name_localized: Care
icon: heart-pulse
is_featured: false
parent_id: null
job_count: 1
-
id: 019fd2b7-f3d8-72d5-842e-c1f00337e9ec
slug: healthcare
name: Gesundheitswesen
name_localized: Healthcare
icon: heart-pulse
is_featured: false
parent_id: null
job_count: 2
-
id: 019fd2b7-f3dc-70cb-a662-0fc23b0ec307
slug: construction
name: 'Bau (Hilfstätigkeiten)'
name_localized: Construction
icon: building
is_featured: false
parent_id: null
job_count: 2
-
id: 019fd2b7-f3df-70bb-8881-36c5f2234495
slug: real_estate
name: Immobilien
name_localized: 'Real Estate'
icon: building
is_featured: false
parent_id: null
job_count: 0
-
id: 019fd2b7-f3e5-714f-8db2-a5ae4350ae5c
slug: graphic_design
name: Grafikdesign
name_localized: 'Graphic Design'
icon: palette
is_featured: false
parent_id: null
job_count: 0
-
id: 019fd2b7-f3e9-71c6-b382-7451adaf4bb7
slug: media
name: Medien
name_localized: Media
icon: palette
is_featured: true
parent_id: null
job_count: 0
-
id: 019fd2b7-f3ec-717a-ac4d-13011f3096f1
slug: education
name: Bildung
name_localized: Education
icon: graduation-cap
is_featured: true
parent_id: null
job_count: 2
-
id: 019fd2b7-f3f0-70a8-b7be-6be4c17c9429
slug: finance
name: Finanzen
name_localized: Finance
icon: chart-line
is_featured: true
parent_id: null
job_count: 0
-
id: 019fd2b7-f3f3-737d-9abe-5edb92ceb02a
slug: agriculture
name: Landwirtschaft
name_localized: Agriculture
icon: leaf
is_featured: false
parent_id: null
job_count: 0
-
id: 019fd2b7-f3f6-70c7-868b-6ac419f0d02c
slug: other
name: Sonstiges
name_localized: Other
icon: ellipsis
is_featured: false
parent_id: null
job_count: 0
categories_grouped:
Gastronomie: []
Hotellerie: []
'Food Service': []
Catering: []
Einzelhandel: []
Lebensmittelhandel: []
Apotheke: []
Produktion: []
Lager: []
Logistik: []
Fertigung: []
Transport: []
Events: []
Security: []
Büro: []
Empfang: []
'Call Center': []
Kundenservice: []
Software: []
'IT Services': []
Reinigung: []
'Facility Management': []
Pflege/Betreuung: []
Gesundheitswesen: []
'Bau (Hilfstätigkeiten)': []
Immobilien: []
Grafikdesign: []
Medien: []
Bildung: []
Finanzen: []
Landwirtschaft: []
Sonstiges: []
states:
-
value: wien
label: Wien
-
value: niederoesterreich
label: Niederösterreich
-
value: oberoesterreich
label: Oberösterreich
-
value: steiermark
label: Steiermark
-
value: salzburg
label: Salzburg
-
value: tirol
label: Tirol
-
value: vorarlberg
label: Vorarlberg
-
value: kaernten
label: Kärnten
-
value: burgenland
label: Burgenland
sort_options:
-
value: newest
label: Neueste
-
value: highest_salary
label: 'Höchstes Gehalt'
-
value: lowest_salary
label: 'Niedrigstes Gehalt'
-
value: nearest
label: Nächstgelegen
-
value: starting_soon
label: 'Bald startend'
-
value: morning_shifts
label: Morgenschichten
-
value: night_shifts
label: Nachtschichten
-
value: featured
label: Empfohlen
-
value: relevance
label: Relevanz
shift_types:
-
value: day
label: Tagschicht
-
value: night
label: Nachtschicht
-
value: weekend
label: Wochenendschicht
-
value: holiday
label: Feiertagsschicht
rate_range:
min: 10
max: 100
step: 0.5
active_min: 13
active_max: 32.08
tags:
- 'Mobile API'
security: []
'/api/v1/mobile/jobs/{jobId}':
get:
summary: 'Get detailed information about a specific job.'
operationId: getDetailedInformationAboutASpecificJob
description: "Returns comprehensive job data including shifts, requirements,\norganization info, and application statistics.\n\nTwo shift arrays come back. They are keyed identically — `date`,\n`formatted_date`, `start_time`, `end_time`, `available_spots`,\n`is_past`, `is_applied` — so one parser reads both. What differs is\nwhether the entries are real:\n\n- **`shift_slots`** — the job's actual shift rows. Each adds an `id`,\n plus `workers_needed`, `is_full`, `meeting_point` and its own\n `application_deadline`. **These ids are what\n `POST /mobile/jobs/{jobId}/apply` takes as `shift_ids`**, and the times\n and capacity here are the shift's own. An empty array means the job has\n no shifts and cannot be applied to.\n- **`shifts`** — a calendar synthesised by walking the job's start and\n end dates, carrying the job-level times and the job-wide vacancy count\n repeated on every entry. No ids, so nothing in it can be applied for.\n\nWhere they disagree, `shift_slots` is right: a company can move one\nshift's hours or headcount, and the calendar will not know.\n\n`applied_shift_dates` is output only: the dates this worker already\nchose. `shift_slots[].is_applied` says the same thing per shift."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
job:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-28c4-732f-a94c-fb5a71a7d682
title:
type: string
examples:
- Accountant
description:
type: string
examples:
- 'Ut nostrum rerum ut alias quia libero excepturi. Voluptatum et aut non quia quisquam molestias. Perferendis qui hic unde.'
status:
type: string
examples:
- active
is_featured:
type: boolean
examples:
- false
category:
type: object
properties:
id:
type: string
examples:
- 019fd2b7-f39f-73e6-870b-fe7584e4f9bc
slug:
type: string
examples:
- office
name:
type: string
examples:
- Büro
name_localized:
type: string
examples:
- Office
icon:
type: string
examples:
- briefcase
color:
type:
- string
- 'null'
examples:
- null
kollektivvertrag:
type: string
examples:
- Handel/Büro
description:
type:
- string
- 'null'
examples:
- null
is_featured:
type: boolean
examples:
- false
tags:
type: array
items:
type: string
examples:
-
- Office
- Nachtschicht
organization:
type: object
properties:
id:
type: string
examples:
- 019fd2b7-f072-7154-8961-5b324cc6c46c
name:
type: string
examples:
- Caritas
logo_url:
type:
- string
- 'null'
examples:
- null
description:
type: string
examples:
- 'Caritas test organisation used for end-to-end portal QA. Safe to delete.'
website:
type: string
examples:
- 'https://www.caritas.at'
city:
type: string
examples:
- Vienna
country:
type: string
examples:
- Austria
industry_code:
type:
- string
- 'null'
examples:
- null
company_size:
type:
- string
- 'null'
examples:
- null
is_verified:
type: boolean
examples:
- true
location:
type: object
properties:
name:
type: string
examples:
- 'Barrows, Christiansen and Jones'
address:
type: string
examples:
- '586 Tremaine Row'
city:
type: string
examples:
- 'East Eliseo'
postal_code:
type: string
examples:
- 10547-3697
lat:
type: number
examples:
- 46.931383
lng:
type: number
examples:
- 11.998284
distance_km:
type:
- string
- 'null'
examples:
- null
schedule:
type: object
properties:
start_date:
type: string
examples:
- '2026-08-12'
end_date:
type: string
examples:
- '2026-08-19'
shift_start_time:
type: string
examples:
- '01:49:00'
shift_end_time:
type: string
examples:
- '18:57:00'
shift_type:
type: string
examples:
- night
shift_type_label:
type: string
examples:
- Nachtschicht
duration_hours:
type: number
examples:
- 17.133333333333
compensation:
type: object
properties:
hourly_rate_gross:
type: number
examples:
- 32.08
supplements:
type: object
properties:
night:
type: number
examples:
- 0.7
weekend:
type: number
examples:
- 3.86
estimated_total_gross:
type:
- string
- 'null'
examples:
- null
currency:
type: string
examples:
- EUR
vacancies:
type: object
properties:
total:
type: integer
examples:
- 5
filled:
type: integer
examples:
- 0
available:
type: integer
examples:
- 5
is_fully_booked:
type: boolean
examples:
- false
is_open_for_applications:
type: boolean
examples:
- true
deadlines:
type: object
properties:
application:
type: string
examples:
- '2026-09-05T16:18:32+00:00'
confirmation:
type: string
examples:
- '2026-08-16T10:20:06+00:00'
created_at:
type: string
examples:
- '2026-08-05T16:18:32+00:00'
is_saved:
type: boolean
examples:
- false
can_apply:
type: boolean
examples:
- true
rate:
type:
- string
- 'null'
examples:
- null
published_at:
type:
- string
- 'null'
examples:
- null
shifts:
type: array
items:
type: object
properties:
date:
type: string
examples:
- '2026-08-12'
formatted_date:
type: string
examples:
- 'Mi., 12. August'
start_time:
type: string
examples:
- '01:49:00'
end_time:
type: string
examples:
- '18:57:00'
available_spots:
type: integer
examples:
- 5
is_past:
type: boolean
examples:
- false
is_applied:
type: boolean
examples:
- false
examples:
-
-
date: '2026-08-12'
formatted_date: 'Mi., 12. August'
start_time: '01:49:00'
end_time: '18:57:00'
available_spots: 5
is_past: false
is_applied: false
-
date: '2026-08-13'
formatted_date: 'Do., 13. August'
start_time: '01:49:00'
end_time: '18:57:00'
available_spots: 5
is_past: false
is_applied: false
-
date: '2026-08-14'
formatted_date: 'Fr., 14. August'
start_time: '01:49:00'
end_time: '18:57:00'
available_spots: 5
is_past: false
is_applied: false
-
date: '2026-08-15'
formatted_date: 'Sa., 15. August'
start_time: '01:49:00'
end_time: '18:57:00'
available_spots: 5
is_past: false
is_applied: false
-
date: '2026-08-16'
formatted_date: 'So., 16. August'
start_time: '01:49:00'
end_time: '18:57:00'
available_spots: 5
is_past: false
is_applied: false
-
date: '2026-08-17'
formatted_date: 'Mo., 17. August'
start_time: '01:49:00'
end_time: '18:57:00'
available_spots: 5
is_past: false
is_applied: false
-
date: '2026-08-18'
formatted_date: 'Di., 18. August'
start_time: '01:49:00'
end_time: '18:57:00'
available_spots: 5
is_past: false
is_applied: false
-
date: '2026-08-19'
formatted_date: 'Mi., 19. August'
start_time: '01:49:00'
end_time: '18:57:00'
available_spots: 5
is_past: false
is_applied: false
shift_slots:
type: array
items:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-28d5-7103-b951-9f6ff1d94556
date:
type: string
examples:
- '2026-08-05'
formatted_date:
type: string
examples:
- 'Mi., 5. August'
start_time:
type: string
examples:
- '08:00:00'
end_time:
type: string
examples:
- '16:00:00'
available_spots:
type: integer
examples:
- 2
is_past:
type: boolean
examples:
- false
is_applied:
type: boolean
examples:
- false
workers_needed:
type: integer
examples:
- 2
is_full:
type: boolean
examples:
- false
meeting_point:
type:
- string
- 'null'
examples:
- null
application_deadline:
type:
- string
- 'null'
examples:
- null
examples:
-
-
id: 019fd2b8-28d5-7103-b951-9f6ff1d94556
date: '2026-08-05'
formatted_date: 'Mi., 5. August'
start_time: '08:00:00'
end_time: '16:00:00'
available_spots: 2
is_past: false
is_applied: false
workers_needed: 2
is_full: false
meeting_point: null
application_deadline: null
application_id:
type:
- string
- 'null'
examples:
- null
application_status:
type:
- string
- 'null'
examples:
- null
applied_shift_dates:
type: array
examples:
- []
applications:
type: object
properties:
total:
type: integer
examples:
- 1
pending:
type: integer
examples:
- 0
requirements:
type: array
items:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-28c9-704f-b685-1cf9be0c3dff
type:
type: string
examples:
- document
type_label:
type: string
examples:
- Dokument
name:
type: string
examples:
- Reisepass
description:
type:
- string
- 'null'
examples:
- null
is_mandatory:
type: boolean
examples:
- true
examples:
-
-
id: 019fd2b8-28c9-704f-b685-1cf9be0c3dff
type: document
type_label: Dokument
name: Reisepass
description: null
is_mandatory: true
-
id: 019fd2b8-28cb-7212-a83d-b62d519bbbf1
type: document
type_label: Dokument
name: Führerschein
description: null
is_mandatory: true
custom_document_requests:
type: array
examples:
- []
qualifications:
type: array
examples:
- []
dress_code:
type: string
examples:
- 'Tempore necessitatibus quia illo suscipit.'
equipment_provided:
type: string
examples:
- 'Adipisci fugiat doloremque atque consectetur necessitatibus sunt cumque.'
rules:
type: object
properties:
payment_terms:
type: string
examples:
- 'Direktzahlung (innerhalb von 3 Werktagen)'
cancellation_policy:
type: string
examples:
- 'Stornierungsrichtlinien gelten'
insurance:
type: string
examples:
- 'Kostenlose Unfallversicherung inklusive'
contact:
type: object
properties:
person_avatar_url:
type:
- string
- 'null'
examples:
- null
additional_info:
type: object
properties:
parking_info:
type:
- string
- 'null'
examples:
- null
special_instructions:
type:
- string
- 'null'
examples:
- null
examples:
-
status: SUCCESS
data:
job:
id: 019fd2b8-28c4-732f-a94c-fb5a71a7d682
title: Accountant
description: 'Ut nostrum rerum ut alias quia libero excepturi. Voluptatum et aut non quia quisquam molestias. Perferendis qui hic unde.'
status: active
is_featured: false
category:
id: 019fd2b7-f39f-73e6-870b-fe7584e4f9bc
slug: office
name: Büro
name_localized: Office
icon: briefcase
color: null
kollektivvertrag: Handel/Büro
description: null
is_featured: false
tags:
- Office
- Nachtschicht
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
logo_url: null
description: 'Caritas test organisation used for end-to-end portal QA. Safe to delete.'
website: 'https://www.caritas.at'
city: Vienna
country: Austria
industry_code: null
company_size: null
is_verified: true
location:
name: 'Barrows, Christiansen and Jones'
address: '586 Tremaine Row'
city: 'East Eliseo'
postal_code: 10547-3697
lat: 46.931383
lng: 11.998284
distance_km: null
schedule:
start_date: '2026-08-12'
end_date: '2026-08-19'
shift_start_time: '01:49:00'
shift_end_time: '18:57:00'
shift_type: night
shift_type_label: Nachtschicht
duration_hours: 17.133333333333
compensation:
hourly_rate_gross: 32.08
supplements:
night: 0.7
weekend: 3.86
estimated_total_gross: null
currency: EUR
vacancies:
total: 5
filled: 0
available: 5
is_fully_booked: false
is_open_for_applications: true
deadlines:
application: '2026-09-05T16:18:32+00:00'
confirmation: '2026-08-16T10:20:06+00:00'
created_at: '2026-08-05T16:18:32+00:00'
is_saved: false
can_apply: true
rate: null
published_at: null
shifts:
-
date: '2026-08-12'
formatted_date: 'Mi., 12. August'
start_time: '01:49:00'
end_time: '18:57:00'
available_spots: 5
is_past: false
is_applied: false
-
date: '2026-08-13'
formatted_date: 'Do., 13. August'
start_time: '01:49:00'
end_time: '18:57:00'
available_spots: 5
is_past: false
is_applied: false
-
date: '2026-08-14'
formatted_date: 'Fr., 14. August'
start_time: '01:49:00'
end_time: '18:57:00'
available_spots: 5
is_past: false
is_applied: false
-
date: '2026-08-15'
formatted_date: 'Sa., 15. August'
start_time: '01:49:00'
end_time: '18:57:00'
available_spots: 5
is_past: false
is_applied: false
-
date: '2026-08-16'
formatted_date: 'So., 16. August'
start_time: '01:49:00'
end_time: '18:57:00'
available_spots: 5
is_past: false
is_applied: false
-
date: '2026-08-17'
formatted_date: 'Mo., 17. August'
start_time: '01:49:00'
end_time: '18:57:00'
available_spots: 5
is_past: false
is_applied: false
-
date: '2026-08-18'
formatted_date: 'Di., 18. August'
start_time: '01:49:00'
end_time: '18:57:00'
available_spots: 5
is_past: false
is_applied: false
-
date: '2026-08-19'
formatted_date: 'Mi., 19. August'
start_time: '01:49:00'
end_time: '18:57:00'
available_spots: 5
is_past: false
is_applied: false
shift_slots:
-
id: 019fd2b8-28d5-7103-b951-9f6ff1d94556
date: '2026-08-05'
formatted_date: 'Mi., 5. August'
start_time: '08:00:00'
end_time: '16:00:00'
available_spots: 2
is_past: false
is_applied: false
workers_needed: 2
is_full: false
meeting_point: null
application_deadline: null
application_id: null
application_status: null
applied_shift_dates: []
applications:
total: 1
pending: 0
requirements:
-
id: 019fd2b8-28c9-704f-b685-1cf9be0c3dff
type: document
type_label: Dokument
name: Reisepass
description: null
is_mandatory: true
-
id: 019fd2b8-28cb-7212-a83d-b62d519bbbf1
type: document
type_label: Dokument
name: Führerschein
description: null
is_mandatory: true
custom_document_requests: []
qualifications: []
dress_code: 'Tempore necessitatibus quia illo suscipit.'
equipment_provided: 'Adipisci fugiat doloremque atque consectetur necessitatibus sunt cumque.'
rules:
payment_terms: 'Direktzahlung (innerhalb von 3 Werktagen)'
cancellation_policy: 'Stornierungsrichtlinien gelten'
insurance: 'Kostenlose Unfallversicherung inklusive'
contact:
person_avatar_url: null
additional_info:
parking_info: null
special_instructions: null
404:
description: 'Not Found'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- RESOURCE_NOT_FOUND
message:
type: string
examples:
- 'Job not found'
examples:
-
status: RESOURCE_NOT_FOUND
message: 'Job not found'
tags:
- 'Mobile API'
security: []
parameters:
-
in: path
name: jobId
description: 'The job UUID.'
required: true
schema:
type: string
examples:
- 9c7f8e6d-5b4a-3c2d-1e0f-9a8b7c6d5e4f
'/api/v1/mobile/jobs/{jobId}/requirements':
get:
summary: 'Get Job Requirements'
operationId: getJobRequirements
description: "What the authenticated employee needs before they can apply for a job:\nevery document-backed requirement the company set, whether the employee\ncurrently satisfies it, and when the satisfying document expires.\n\nThe same rules gate the application itself — {@see JobRequirementGate} is\nshared with ApplyForJobAction — so this can never disagree with what happens\non submit. Without it the app could only discover an unmet requirement by\nattempting to apply and reading back the rejection.\n\n`ready` reports on mandatory requirements only. Optional ones are returned\nso the employee can see them, but they never block an application.\n\nItem `status` is one of `verified`, `pending`, `rejected`,\n`reupload_requested`, `expired` or `not_provided`."
parameters: []
responses:
200:
description: ''
content:
application/json:
schema:
oneOf:
-
description: 'Ready to apply'
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Requirements retrieved.'
data:
type: object
properties:
ready:
type: boolean
examples:
- true
account_status:
type: string
examples:
- active
contract:
type: object
properties:
status:
type: string
examples:
- signed
id:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
items:
type: array
examples:
- []
examples:
-
status: SUCCESS
message: 'Requirements retrieved.'
data:
ready: true
account_status: active
contract:
status: signed
id: 019f9939-c4c3-70fb-a54e-5ebf63db36d2
items: []
-
description: 'Still under review'
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Requirements retrieved.'
data:
type: object
properties:
ready:
type: boolean
examples:
- false
account_status:
type: string
examples:
- pending_approval
contract:
type: object
properties:
status:
type: string
examples:
- awaiting_approval
id:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
items:
type: array
examples:
- []
examples:
-
status: SUCCESS
message: 'Requirements retrieved.'
data:
ready: false
account_status: pending_approval
contract:
status: awaiting_approval
id: 019f9939-c4c3-70fb-a54e-5ebf63db36d2
items: []
-
description: 'Recorded from a live call'
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Requirements retrieved.'
data:
type: object
properties:
ready:
type: boolean
examples:
- false
account_status:
type: string
examples:
- active
contract:
type: object
properties:
status:
type: string
examples:
- unavailable
id:
type:
- string
- 'null'
examples:
- null
items:
type: array
items:
type: object
properties:
requirement_code:
type: string
examples:
- passport
name:
type: string
examples:
- Reisepass
description:
type:
- string
- 'null'
examples:
- null
requirement_type:
type: string
examples:
- document
requirement_type_label:
type: string
examples:
- Dokument
is_mandatory:
type: boolean
examples:
- true
accepts:
type: array
items:
type: string
examples:
-
- passport
satisfied:
type: boolean
examples:
- true
status:
type: string
examples:
- verified
valid_until:
type: string
examples:
- '2033-05-22'
examples:
-
-
requirement_code: passport
name: Reisepass
description: null
requirement_type: document
requirement_type_label: Dokument
is_mandatory: true
accepts:
- passport
satisfied: true
status: verified
valid_until: '2033-05-22'
-
requirement_code: driver_license
name: Führerschein
description: null
requirement_type: document
requirement_type_label: Dokument
is_mandatory: true
accepts:
- driver_license
satisfied: false
status: not_provided
valid_until: null
examples:
-
status: SUCCESS
message: 'Requirements retrieved.'
data:
ready: false
account_status: active
contract:
status: unavailable
id: null
items:
-
requirement_code: passport
name: Reisepass
description: null
requirement_type: document
requirement_type_label: Dokument
is_mandatory: true
accepts:
- passport
satisfied: true
status: verified
valid_until: '2033-05-22'
-
requirement_code: driver_license
name: Führerschein
description: null
requirement_type: document
requirement_type_label: Dokument
is_mandatory: true
accepts:
- driver_license
satisfied: false
status: not_provided
valid_until: null
404:
description: 'Job not found'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- RESOURCE_NOT_FOUND
message:
type: string
examples:
- 'The job was not found.'
examples:
-
status: RESOURCE_NOT_FOUND
message: 'The job was not found.'
tags:
- 'Mobile API'
parameters:
-
in: path
name: jobId
description: 'The job to check.'
required: true
schema:
type: string
examples:
- "019f9939-c4c3-70fb-a54e-5ebf63db36d2\n\nThe framework agreement is reported separately from `items`: everything\nin that list is answered by uploading a document, while this one is\nanswered by signing. Its id is included so the app can post straight to\n`POST /mobile/contracts/{contractId}/sign` and return here. It counts\ntowards `ready` all the same — applying is refused without it.\n\n`account_status` is the worker's lifecycle state, in the same vocabulary\nas the 403 notices. Applying and signing both need `active`; until then\n`ready` is false however complete the checklist is, and the agreement\nreads `awaiting_approval` rather than `signature_required` — signing\nbefore approval answers 403, so an app that offered the button would be\noffering a dead one."
'/api/v1/mobile/jobs/{jobId}/apply':
post:
summary: 'Apply For Job'
operationId: applyForJob
description: "Applies to a job and, in the same request, says which of its shifts the\nworker wants. The application is job-level; the chosen shifts are\nattached to it.\n\n**`shift_ids` come from `shift_slots` in `GET /mobile/jobs/{jobId}`** —\nthe `id` of each slot the worker picked. Do not send dates: the `shifts`\narray on that same response is a display-only calendar synthesised from\nthe job's date range and carries no ids, and `applied_shift_dates` is\nwhat the platform reports back after applying, not an input. A job whose\n`shift_slots` is empty has no shifts to choose and cannot be applied to.\n\nA full shift may still be chosen — that places the worker on standby for\nit rather than refusing the application.\n\n**Calling this again for a job already applied to adds shifts** rather\nthan being refused: a worker applies for shifts, and wanting a further\nday is a new request, not a repeat. The application keeps its id and\nstatus, so the company still sees one applicant, and the response\ncarries `added_shift_ids` — the subset that was new — with 200 instead\nof 201. On a **selected** application the added shifts are booked\nimmediately — the company already chose this worker, so the new days\nbecome assignments (with their own Überlassungsvertrag) right away; if\nnone of them still has room, the request is refused and nothing is\nattached.\n\nIt is refused with `DUPLICATE_ENTRY` only when every shift sent is\nalready on the application, or when it is closed (rejected, withdrawn,\nexpired, cancelled): there the decision was against working, and adding\nwork to it is not the worker's to do."
parameters: []
responses:
200:
description: 'Further shifts added to an existing application'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Die Schichten wurden Ihrer Bewerbung hinzugefügt.'
data:
type: object
properties:
application:
type: object
properties:
id:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
status:
type: string
examples:
- pending
added_shift_ids:
type: array
items:
type: string
examples:
-
- 019f9939-c4c3-70fb-a54e-5ebf63db36d3
shift_dates:
type: array
items:
type: string
examples:
-
- '2026-08-12'
- '2026-08-19'
examples:
-
status: SUCCESS
message: 'Die Schichten wurden Ihrer Bewerbung hinzugefügt.'
data:
application:
id: 019f9939-c4c3-70fb-a54e-5ebf63db36d2
status: pending
added_shift_ids:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d3
shift_dates:
- '2026-08-12'
- '2026-08-19'
201:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Your application has been submitted successfully.'
data:
type: object
properties:
application:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-76c6-72bb-a2d9-98ed4934fb02
job_id:
type: string
examples:
- 019fd2b8-7568-72f7-89ad-5bec0d9779ff
status:
type: string
examples:
- pending
applied_at:
type: string
examples:
- '2026-08-05T16:18:52+00:00'
has_scheduling_conflict:
type: boolean
examples:
- false
shift_ids:
type: array
items:
type: string
examples:
-
- 019fd2b8-756e-70aa-a7ad-01157af79df0
shift_dates:
type: array
items:
type: string
examples:
-
- '2026-08-12'
examples:
-
status: SUCCESS
message: 'Your application has been submitted successfully.'
data:
application:
id: 019fd2b8-76c6-72bb-a2d9-98ed4934fb02
job_id: 019fd2b8-7568-72f7-89ad-5bec0d9779ff
status: pending
applied_at: '2026-08-05T16:18:52+00:00'
has_scheduling_conflict: false
shift_ids:
- 019fd2b8-756e-70aa-a7ad-01157af79df0
shift_dates:
- '2026-08-12'
409:
description: 'Nothing new in the request'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- DUPLICATE_ENTRY
message:
type: string
examples:
- 'Sie haben sich für diese Schichten bereits beworben.'
examples:
-
status: DUPLICATE_ENTRY
message: 'Sie haben sich für diese Schichten bereits beworben.'
422:
description: ''
content:
application/json:
schema:
oneOf:
-
description: 'No shifts chosen'
type: object
properties:
status:
type: string
examples:
- VALIDATION_ERROR
message:
type: string
examples:
- 'Bitte wähle mindestens eine Schicht aus, bevor du dich bewirbst.'
examples:
-
status: VALIDATION_ERROR
message: 'Bitte wähle mindestens eine Schicht aus, bevor du dich bewirbst.'
-
description: 'A chosen shift is not selectable'
type: object
properties:
status:
type: string
examples:
- VALIDATION_ERROR
message:
type: string
examples:
- 'Mindestens eine der gewählten Schichten ist nicht mehr verfügbar.'
examples:
-
status: VALIDATION_ERROR
message: 'Mindestens eine der gewählten Schichten ist nicht mehr verfügbar.'
tags:
- 'Mobile API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
shift_ids:
type: array
description: 'The shifts applied for, as `shift_slots[].id` values from the job detail. At least one; each must belong to this job, not be cancelled, and its application deadline must not have passed.'
items:
type: string
examples:
-
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
acknowledge_conflict:
type: boolean
description: 'Apply anyway when the chosen shifts clash with work the worker already has.'
examples:
- false
documents:
type: object
description: 'Files this job asks applicants to attach, keyed by the id from `custom_document_requests` — sent as multipart, e.g. `documents[019f9939-…]`.'
properties: { }
examples:
- null
required:
- shift_ids
parameters:
-
in: path
name: jobId
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
/api/v1/mobile/saved-jobs:
get:
summary: "List employee's saved jobs (Merkzettel)."
operationId: listEmployeesSavedJobsMerkzettel
description: "Returns only active saved jobs (not auto-removed).\nIncludes job details and application status if applied."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
saved_jobs:
type: array
examples:
- []
meta:
type: object
properties:
total:
type: integer
examples:
- 0
examples:
-
status: SUCCESS
data:
saved_jobs: []
meta:
total: 0
tags:
- 'Mobile API'
'/api/v1/mobile/jobs/{jobId}/save':
post:
summary: 'Save Job'
operationId: saveJob
description: "Puts a job on the worker's Merkzettel, with an optional note and\nreminder preferences. Saving a job that is already saved updates it\nrather than adding a second entry, so this doubles as the edit call:\nsend only what is changing, omitted fields keep their value.\n\n`DELETE` on the same path unsaves it.\n\n`POST /mobile/jobs/{jobId}/bookmark` also exists — it toggles saved\nstate and takes no body. Use that for a one-tap heart, and this when the\nworker is setting a note or a reminder.\n\n`notify_deadline` is acted on: a worker who asks for it is told once,\nshortly before applications close, by the `jobs:remind-saved-deadlines`\nsweep."
parameters: []
responses:
201:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'The job has been saved.'
data:
type: object
properties:
saved_job_id:
type: string
examples:
- 019fd2b8-7687-717b-a68d-76c060caa63f
saved_at:
type: string
examples:
- '2026-08-05T16:18:52+00:00'
examples:
-
status: SUCCESS
message: 'The job has been saved.'
data:
saved_job_id: 019fd2b8-7687-717b-a68d-76c060caa63f
saved_at: '2026-08-05T16:18:52+00:00'
tags:
- 'Mobile API'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
notes:
type: string
description: "The worker's own note, shown back to them on the saved list."
examples:
- 'Nachtschicht, Anfahrt 25 min'
notify_deadline:
type: boolean
description: 'Remind the worker before applications close. Defaults to true on a first save.'
examples:
- true
notify_vacancy_change:
type: boolean
description: 'Tell the worker when the number of open spots changes.'
examples:
- false
delete:
summary: 'Save Job'
operationId: saveJob
description: "Puts a job on the worker's Merkzettel, with an optional note and\nreminder preferences. Saving a job that is already saved updates it\nrather than adding a second entry, so this doubles as the edit call:\nsend only what is changing, omitted fields keep their value.\n\n`DELETE` on the same path unsaves it.\n\n`POST /mobile/jobs/{jobId}/bookmark` also exists — it toggles saved\nstate and takes no body. Use that for a one-tap heart, and this when the\nworker is setting a note or a reminder.\n\n`notify_deadline` is acted on: a worker who asks for it is told once,\nshortly before applications close, by the `jobs:remind-saved-deadlines`\nsweep."
parameters: []
responses:
201:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'The job has been saved.'
data:
type: object
properties:
saved_job_id:
type: string
examples:
- 019fd2b8-7687-717b-a68d-76c060caa63f
saved_at:
type: string
examples:
- '2026-08-05T16:18:52+00:00'
examples:
-
status: SUCCESS
message: 'The job has been saved.'
data:
saved_job_id: 019fd2b8-7687-717b-a68d-76c060caa63f
saved_at: '2026-08-05T16:18:52+00:00'
tags:
- 'Mobile API'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
notes:
type: string
description: "The worker's own note, shown back to them on the saved list."
examples:
- 'Nachtschicht, Anfahrt 25 min'
notify_deadline:
type: boolean
description: 'Remind the worker before applications close. Defaults to true on a first save.'
examples:
- true
notify_vacancy_change:
type: boolean
description: 'Tell the worker when the number of open spots changes.'
examples:
- false
parameters:
-
in: path
name: jobId
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
'/api/v1/mobile/jobs/{jobId}/bookmark':
post:
summary: 'Toggle bookmark (save/unsave) for a job.'
operationId: toggleBookmarksaveunsaveForAJob
description: "POST /mobile/jobs/{jobId}/bookmark\n\nIf the job is already bookmarked → removes it (is_bookmarked: false).\nIf not bookmarked → saves it (is_bookmarked: true)."
parameters: []
responses:
200:
description: ''
content:
application/json:
schema:
oneOf:
-
description: Unbookmarked
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
is_bookmarked:
type: boolean
examples:
- false
saved_job_id:
type:
- string
- 'null'
examples:
- null
examples:
-
status: SUCCESS
data:
is_bookmarked: false
saved_job_id: null
-
description: 'Recorded from a live call'
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
is_bookmarked:
type: boolean
examples:
- true
saved_job_id:
type: string
examples:
- 019fd2b8-3879-73c5-8283-53557bc9c066
examples:
-
status: SUCCESS
data:
is_bookmarked: true
saved_job_id: 019fd2b8-3879-73c5-8283-53557bc9c066
404:
description: 'Not Found'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- RESOURCE_NOT_FOUND
message:
type: string
examples:
- 'Job nicht gefunden.'
examples:
-
status: RESOURCE_NOT_FOUND
message: 'Job nicht gefunden.'
tags:
- 'Mobile API'
parameters:
-
in: path
name: jobId
description: 'The job UUID.'
required: true
schema:
type: string
examples:
- 9c7f8e6d-5b4a-3c2d-1e0f-9a8b7c6d5e4f
/api/v1/mobile/recommended-jobs:
get:
summary: 'Get AI-powered job recommendations for the employee.'
operationId: getAIPoweredJobRecommendationsForTheEmployee
description: "Returns jobs scored by:\n- Location proximity (40%)\n- Qualification match (25%)\n- Past job category history (15%)\n- Company rating (10%)\n- Reliability score (10%)"
parameters:
-
in: query
name: limit
description: 'Number of recommendations to return (max 50, default 20).'
required: false
schema:
type: integer
description: 'Number of recommendations to return (max 50, default 20).'
examples:
- 20
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
recommendations:
type: array
items:
type: object
properties:
job:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-1a90-7125-af02-72f37fef65ea
title:
type: string
examples:
- 'Backoffice Assistenz'
description:
type: string
examples:
- 'Wir suchen engagierte Backoffice Assistenz zur Verstärkung unseres Teams. Sie erwartet ein abwechslungsreiches Aufgabengebiet in einem dynamischen Umfeld.'
status:
type: string
examples:
- active
is_featured:
type: boolean
examples:
- false
category:
type: object
properties:
id:
type: string
examples: [019fd2b7-f39f-73e6-870b-fe7584e4f9bc]
slug:
type: string
examples: [office]
name:
type: string
examples: [Büro]
name_localized:
type: string
examples: [Office]
icon:
type: string
examples: [briefcase]
color:
type: [string, 'null']
examples: [null]
tags:
type: array
items:
type: string
examples:
-
- Office
- Tagschicht
organization:
type: object
properties:
id:
type: string
examples: [019fd2b7-f768-7325-b254-280a67b1a995]
name:
type: string
examples: ['Retail Services GmbH']
logo_url:
type: [string, 'null']
examples: [null]
average_rating:
type: [string, 'null']
examples: [null]
location:
type: object
properties:
name:
type: string
examples: ['Steuerberatung Wien']
address:
type: string
examples: ['Margaretenstraße 90, 1050 Wien']
city:
type: string
examples: [Wien]
postal_code:
type: string
examples: ['1050']
lat:
type: number
examples: [48.1944]
lng:
type: number
examples: [16.3585]
distance_km:
type: [string, 'null']
examples: [null]
schedule:
type: object
properties:
start_date:
type: string
examples: ['2026-08-15']
end_date:
type: string
examples: ['2026-09-04']
shift_start_time:
type: string
examples: ['08:00:00']
shift_end_time:
type: string
examples: ['16:00:00']
shift_type:
type: string
examples: [day]
shift_type_label:
type: string
examples: [Tagschicht]
duration_hours:
type: integer
examples: [8]
compensation:
type: object
properties:
hourly_rate_gross:
type: integer
examples: [16]
supplements:
type: object
properties: { weekend_bonus: { type: integer, examples: [8] } }
estimated_total_gross:
type: [string, 'null']
examples: [null]
currency:
type: string
examples: [EUR]
vacancies:
type: object
properties:
total:
type: integer
examples: [1]
filled:
type: integer
examples: [0]
available:
type: integer
examples: [1]
deadlines:
type: object
properties:
application:
type: string
examples: ['2026-08-10T16:18:26+00:00']
created_at:
type: string
examples:
- '2026-08-05T16:18:28+00:00'
is_saved:
type: boolean
examples:
- false
can_apply:
type: boolean
examples:
- true
rate:
type:
- string
- 'null'
examples:
- null
recommendation:
type: object
properties:
score:
type: number
examples:
- 61.5
reasons:
type: array
items:
type: string
examples:
-
- 'Passt zu Ihren Qualifikationen'
breakdown:
type: object
properties:
location:
type: integer
examples: [50]
qualifications:
type: integer
examples: [100]
category_history:
type: integer
examples: [10]
company_rating:
type: integer
examples: [50]
reliability:
type: integer
examples: [100]
examples:
-
-
job:
id: 019fd2b8-1a90-7125-af02-72f37fef65ea
title: 'Backoffice Assistenz'
description: 'Wir suchen engagierte Backoffice Assistenz zur Verstärkung unseres Teams. Sie erwartet ein abwechslungsreiches Aufgabengebiet in einem dynamischen Umfeld.'
status: active
is_featured: false
category:
id: 019fd2b7-f39f-73e6-870b-fe7584e4f9bc
slug: office
name: Büro
name_localized: Office
icon: briefcase
color: null
tags:
- Office
- Tagschicht
organization:
id: 019fd2b7-f768-7325-b254-280a67b1a995
name: 'Retail Services GmbH'
logo_url: null
average_rating: null
location:
name: 'Steuerberatung Wien'
address: 'Margaretenstraße 90, 1050 Wien'
city: Wien
postal_code: '1050'
lat: 48.1944
lng: 16.3585
distance_km: null
schedule:
start_date: '2026-08-15'
end_date: '2026-09-04'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 16
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 1
filled: 0
available: 1
deadlines:
application: '2026-08-10T16:18:26+00:00'
created_at: '2026-08-05T16:18:28+00:00'
is_saved: false
can_apply: true
rate: null
recommendation:
score: 61.5
reasons:
- 'Passt zu Ihren Qualifikationen'
breakdown:
location: 50
qualifications: 100
category_history: 10
company_rating: 50
reliability: 100
-
job:
id: 019fd2b8-1265-737c-ae21-e5265dc709d8
title: 'Servicekraft Restaurant Mitte'
description: 'Wir suchen motivierte Servicekraft Restaurant Mitte für unser engagiertes Team. Sie unterstützen uns bei der professionellen Gästebetreuung und sorgen für ein unvergessliches Erlebnis. Vorkenntnisse in der Gastronomie sind von Vorteil, aber nicht zwingend erforderlich.'
status: active
is_featured: false
category:
id: 019fd2b7-f371-732c-8cdb-6de13be42891
slug: gastro
name: Gastronomie
name_localized: Gastronomy
icon: utensils
color: null
tags:
- Gastronomy
- Tagschicht
- 'HACCP Kenntnisse von Vorteil'
organization:
id: 019fd2b7-ff32-7117-ab28-06e2d3082002
name: 'Bildungszentrum Mitte'
logo_url: null
average_rating: null
location:
name: 'Brasserie Mitte'
address: 'Schwarzenbergplatz 3, 1010 Wien'
city: Wien
postal_code: '1010'
lat: 48.2082
lng: 16.3739
distance_km: null
schedule:
start_date: '2026-08-10'
end_date: '2026-09-09'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 14.5
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 8
filled: 0
available: 8
deadlines:
application: '2026-08-07T16:18:26+00:00'
created_at: '2026-08-05T16:18:26+00:00'
is_saved: false
can_apply: true
rate: null
recommendation:
score: 60
reasons:
- 'Passt zu Ihren Qualifikationen'
breakdown:
location: 50
qualifications: 100
category_history: 0
company_rating: 50
reliability: 100
-
job:
id: 019fd2b8-1287-7146-a673-6798f3d03acc
title: 'Barkeeper Spätschicht Club'
description: 'Wir suchen motivierte Barkeeper Spätschicht Club für unser engagiertes Team. Sie unterstützen uns bei der professionellen Gästebetreuung und sorgen für ein unvergessliches Erlebnis. Vorkenntnisse in der Gastronomie sind von Vorteil, aber nicht zwingend erforderlich.'
status: active
is_featured: false
category:
id: 019fd2b7-f371-732c-8cdb-6de13be42891
slug: gastro
name: Gastronomie
name_localized: Gastronomy
icon: utensils
color: null
tags:
- Gastronomy
- Nachtschicht
- 'HACCP Kenntnisse von Vorteil'
organization:
id: 019fd2b7-f5ae-7390-a778-c08c8d56cdc0
name: 'Event Solutions Austria'
logo_url: null
average_rating: null
location:
name: 'Club Passage'
address: 'Babenbergerstraße 9, 1010 Wien'
city: Wien
postal_code: '1070'
lat: 48.2003
lng: 16.3465
distance_km: null
schedule:
start_date: '2026-08-08'
end_date: '2026-11-03'
shift_start_time: '22:00:00'
shift_end_time: '06:00:00'
shift_type: night
shift_type_label: Nachtschicht
duration_hours: 8
compensation:
hourly_rate_gross: 16
supplements:
night_bonus: 15
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 4
filled: 0
available: 4
deadlines:
application: '2026-08-06T16:18:26+00:00'
created_at: '2026-08-05T16:18:26+00:00'
is_saved: false
can_apply: true
rate: null
recommendation:
score: 60
reasons:
- 'Passt zu Ihren Qualifikationen'
breakdown:
location: 50
qualifications: 100
category_history: 0
company_rating: 50
reliability: 100
-
job:
id: 019fd2b8-1298-737e-bbfd-295992feb4db
title: 'Küchenhilfe Großküche'
description: 'Wir suchen motivierte Küchenhilfe Großküche für unser engagiertes Team. Sie unterstützen uns bei der professionellen Gästebetreuung und sorgen für ein unvergessliches Erlebnis. Vorkenntnisse in der Gastronomie sind von Vorteil, aber nicht zwingend erforderlich.'
status: active
is_featured: false
category:
id: 019fd2b7-f371-732c-8cdb-6de13be42891
slug: gastro
name: Gastronomie
name_localized: Gastronomy
icon: utensils
color: null
tags:
- Gastronomy
- Tagschicht
- 'HACCP Kenntnisse von Vorteil'
organization:
id: 019fd2b7-fad7-719c-887a-a0f510bbd31d
name: 'IT Solutions GmbH'
logo_url: null
average_rating: null
location:
name: 'SV Gastronomie Wien'
address: 'Gablenzgasse 11, 1150 Wien'
city: Wien
postal_code: '1150'
lat: 48.196
lng: 16.3268
distance_km: null
schedule:
start_date: '2026-08-12'
end_date: '2026-12-03'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 13.5
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 10
filled: 0
available: 10
deadlines:
application: '2026-08-07T16:18:26+00:00'
created_at: '2026-08-05T16:18:26+00:00'
is_saved: false
can_apply: true
rate: null
recommendation:
score: 60
reasons:
- 'Passt zu Ihren Qualifikationen'
breakdown:
location: 50
qualifications: 100
category_history: 0
company_rating: 50
reliability: 100
-
job:
id: 019fd2b8-12b2-72ff-8be7-dadbf8e167b6
title: 'Kellner*in Haubenrestaurant'
description: 'Wir suchen motivierte Kellner*in Haubenrestaurant für unser engagiertes Team. Sie unterstützen uns bei der professionellen Gästebetreuung und sorgen für ein unvergessliches Erlebnis. Vorkenntnisse in der Gastronomie sind von Vorteil, aber nicht zwingend erforderlich.'
status: active
is_featured: false
category:
id: 019fd2b7-f371-732c-8cdb-6de13be42891
slug: gastro
name: Gastronomie
name_localized: Gastronomy
icon: utensils
color: null
tags:
- Gastronomy
- Tagschicht
- 'HACCP Kenntnisse von Vorteil'
organization:
id: 019fd2b7-fca6-71cf-8683-c97f6f50a24a
name: 'Reinigungsservice Alpin'
logo_url: null
average_rating: null
location:
name: 'Restaurant Steirereck'
address: 'Am Heumarkt 2a, 1030 Wien'
city: Wien
postal_code: '1030'
lat: 48.2014
lng: 16.387
distance_km: null
schedule:
start_date: '2026-08-15'
end_date: '2026-10-04'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 15.5
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 3
filled: 0
available: 3
deadlines:
application: '2026-08-10T16:18:26+00:00'
created_at: '2026-08-05T16:18:26+00:00'
is_saved: false
can_apply: true
rate: null
recommendation:
score: 60
reasons:
- 'Passt zu Ihren Qualifikationen'
breakdown:
location: 50
qualifications: 100
category_history: 0
company_rating: 50
reliability: 100
-
job:
id: 019fd2b8-12c7-72ab-bd18-53060b989f57
title: 'Buffetkraft Messe'
description: 'Wir suchen motivierte Buffetkraft Messe für unser engagiertes Team. Sie unterstützen uns bei der professionellen Gästebetreuung und sorgen für ein unvergessliches Erlebnis. Vorkenntnisse in der Gastronomie sind von Vorteil, aber nicht zwingend erforderlich.'
status: active
is_featured: false
category:
id: 019fd2b7-f371-732c-8cdb-6de13be42891
slug: gastro
name: Gastronomie
name_localized: Gastronomy
icon: utensils
color: null
tags:
- Gastronomy
- Tagschicht
- 'HACCP Kenntnisse von Vorteil'
organization:
id: 019fd2b7-fe56-70d1-bb3a-641339ce636a
name: 'Lagerhaus Steiermark'
logo_url: null
average_rating: null
location:
name: 'Reed Messe Wien'
address: 'Messeplatz 1, 1021 Wien'
city: Wien
postal_code: '1020'
lat: 48.2176
lng: 16.4138
distance_km: null
schedule:
start_date: '2026-08-19'
end_date: '2026-08-21'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 13.8
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 15
filled: 0
available: 15
deadlines:
application: '2026-08-15T16:18:26+00:00'
created_at: '2026-08-05T16:18:26+00:00'
is_saved: false
can_apply: true
rate: null
recommendation:
score: 60
reasons:
- 'Passt zu Ihren Qualifikationen'
breakdown:
location: 50
qualifications: 100
category_history: 0
company_rating: 50
reliability: 100
-
job:
id: 019fd2b8-12d6-722c-8511-2aaa42b3d821
title: 'Servicepersonal Weinbar'
description: 'Wir suchen motivierte Servicepersonal Weinbar für unser engagiertes Team. Sie unterstützen uns bei der professionellen Gästebetreuung und sorgen für ein unvergessliches Erlebnis. Vorkenntnisse in der Gastronomie sind von Vorteil, aber nicht zwingend erforderlich.'
status: active
is_featured: false
category:
id: 019fd2b7-f371-732c-8cdb-6de13be42891
slug: gastro
name: Gastronomie
name_localized: Gastronomy
icon: utensils
color: null
tags:
- Gastronomy
- Tagschicht
- 'HACCP Kenntnisse von Vorteil'
organization:
id: 019fd2b8-000d-719b-a73e-71665713a4fc
name: 'Supermarkt AG'
logo_url: null
average_rating: null
location:
name: 'Weinbar Graz'
address: 'Herrengasse 5, 8010 Graz'
city: Graz
postal_code: '8010'
lat: 47.0707
lng: 15.4395
distance_km: null
schedule:
start_date: '2026-08-09'
end_date: '2027-02-01'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 14
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 5
filled: 0
available: 5
deadlines:
application: '2026-08-07T16:18:26+00:00'
created_at: '2026-08-05T16:18:26+00:00'
is_saved: false
can_apply: true
rate: null
recommendation:
score: 60
reasons:
- 'Passt zu Ihren Qualifikationen'
breakdown:
location: 50
qualifications: 100
category_history: 0
company_rating: 50
reliability: 100
-
job:
id: 019fd2b8-12f4-73f7-a675-8bf7331044c3
title: 'Koch/Köchin Bistro'
description: 'Wir suchen motivierte Koch/Köchin Bistro für unser engagiertes Team. Sie unterstützen uns bei der professionellen Gästebetreuung und sorgen für ein unvergessliches Erlebnis. Vorkenntnisse in der Gastronomie sind von Vorteil, aber nicht zwingend erforderlich.'
status: active
is_featured: false
category:
id: 019fd2b7-f371-732c-8cdb-6de13be42891
slug: gastro
name: Gastronomie
name_localized: Gastronomy
icon: utensils
color: null
tags:
- Gastronomy
- Tagschicht
- 'HACCP Kenntnisse von Vorteil'
organization:
id: 019fd2b7-f4d3-71a1-89d4-ca7d5731b32a
name: 'Wiener Gastro GmbH'
logo_url: null
average_rating: null
location:
name: 'Bistro Donau'
address: 'Landstraße 30, 4020 Linz'
city: Linz
postal_code: '4020'
lat: 48.3069
lng: 14.2858
distance_km: null
schedule:
start_date: '2026-08-17'
end_date: '2026-11-03'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 15.8
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 2
filled: 0
available: 2
deadlines:
application: '2026-08-14T16:18:26+00:00'
created_at: '2026-08-05T16:18:26+00:00'
is_saved: false
can_apply: true
rate: null
recommendation:
score: 60
reasons:
- 'Passt zu Ihren Qualifikationen'
breakdown:
location: 50
qualifications: 100
category_history: 0
company_rating: 50
reliability: 100
-
job:
id: 019fd2b8-130c-7006-942a-09ca3ab2b639
title: 'Bankettkellner Festsaal'
description: 'Wir suchen motivierte Bankettkellner Festsaal für unser engagiertes Team. Sie unterstützen uns bei der professionellen Gästebetreuung und sorgen für ein unvergessliches Erlebnis. Vorkenntnisse in der Gastronomie sind von Vorteil, aber nicht zwingend erforderlich.'
status: active
is_featured: false
category:
id: 019fd2b7-f371-732c-8cdb-6de13be42891
slug: gastro
name: Gastronomie
name_localized: Gastronomy
icon: utensils
color: null
tags:
- Gastronomy
- Tagschicht
- 'HACCP Kenntnisse von Vorteil'
organization:
id: 019fd2b7-fca6-71cf-8683-c97f6f50a24a
name: 'Reinigungsservice Alpin'
logo_url: null
average_rating: null
location:
name: 'Schlosshotel Mirabell'
address: 'Mirabellplatz 2, 5020 Salzburg'
city: Salzburg
postal_code: '5020'
lat: 47.8095
lng: 13.055
distance_km: null
schedule:
start_date: '2026-08-13'
end_date: '2026-09-19'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 14.8
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 8
filled: 0
available: 8
deadlines:
application: '2026-08-10T16:18:26+00:00'
created_at: '2026-08-05T16:18:26+00:00'
is_saved: false
can_apply: true
rate: null
recommendation:
score: 60
reasons:
- 'Passt zu Ihren Qualifikationen'
breakdown:
location: 50
qualifications: 100
category_history: 0
company_rating: 50
reliability: 100
-
job:
id: 019fd2b8-13e2-7390-a987-e12b987cdbb8
title: 'Weihnachtsmarkt Servicekraft'
description: 'Wir suchen motivierte Weihnachtsmarkt Servicekraft für unser engagiertes Team. Sie unterstützen uns bei der professionellen Gästebetreuung und sorgen für ein unvergessliches Erlebnis. Vorkenntnisse in der Gastronomie sind von Vorteil, aber nicht zwingend erforderlich.'
status: active
is_featured: false
category:
id: 019fd2b7-f371-732c-8cdb-6de13be42891
slug: gastro
name: Gastronomie
name_localized: Gastronomy
icon: utensils
color: null
tags:
- Gastronomy
- Tagschicht
- 'HACCP Kenntnisse von Vorteil'
organization:
id: 019fd2b7-f91f-70cb-8409-8632db9df3c7
name: 'Sicherheitsdienst Österreich'
logo_url: null
average_rating: null
location:
name: 'Christkindlmarkt Rathausplatz'
address: 'Rathausplatz 1, 1010 Wien'
city: Wien
postal_code: '1010'
lat: 48.2082
lng: 16.3739
distance_km: null
schedule:
start_date: '2027-01-02'
end_date: '2027-02-01'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 14
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 30
filled: 0
available: 30
deadlines:
application: '2026-12-29T16:18:26+00:00'
created_at: '2026-08-05T16:18:26+00:00'
is_saved: false
can_apply: true
rate: null
recommendation:
score: 60
reasons:
- 'Passt zu Ihren Qualifikationen'
breakdown:
location: 50
qualifications: 100
category_history: 0
company_rating: 50
reliability: 100
-
job:
id: 019fd2b8-14dd-7377-92d2-447578550d00
title: 'Convention Coordinator'
description: 'Wir suchen engagierte Convention Coordinator zur Verstärkung unseres Teams. Sie erwartet ein abwechslungsreiches Aufgabengebiet in einem dynamischen Umfeld.'
status: active
is_featured: false
category:
id: 019fd2b7-f375-724e-84b8-4f9647ef6419
slug: hotel
name: Hotellerie
name_localized: Hospitality
icon: hotel
color: null
tags:
- Hospitality
- Tagschicht
organization:
id: 019fd2b8-000d-719b-a73e-71665713a4fc
name: 'Supermarkt AG'
logo_url: null
average_rating: null
location:
name: 'Austria Center Vienna'
address: 'Bruno-Kreisky-Platz 1, 1220 Wien'
city: Wien
postal_code: '1010'
lat: 48.2082
lng: 16.3739
distance_km: null
schedule:
start_date: '2026-08-25'
end_date: '2026-08-30'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 18
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 5
filled: 0
available: 5
deadlines:
application: '2026-08-23T16:18:26+00:00'
created_at: '2026-08-05T16:18:27+00:00'
is_saved: false
can_apply: true
rate: null
recommendation:
score: 60
reasons:
- 'Passt zu Ihren Qualifikationen'
breakdown:
location: 50
qualifications: 100
category_history: 0
company_rating: 50
reliability: 100
-
job:
id: 019fd2b8-1405-709f-bca9-b0a418fb6a75
title: 'Silvesternacht Service'
description: 'Wir suchen motivierte Silvesternacht Service für unser engagiertes Team. Sie unterstützen uns bei der professionellen Gästebetreuung und sorgen für ein unvergessliches Erlebnis. Vorkenntnisse in der Gastronomie sind von Vorteil, aber nicht zwingend erforderlich.'
status: active
is_featured: false
category:
id: 019fd2b7-f371-732c-8cdb-6de13be42891
slug: gastro
name: Gastronomie
name_localized: Gastronomy
icon: utensils
color: null
tags:
- Gastronomy
- Nachtschicht
- 'HACCP Kenntnisse von Vorteil'
organization:
id: 019fd2b7-fe56-70d1-bb3a-641339ce636a
name: 'Lagerhaus Steiermark'
logo_url: null
average_rating: null
location:
name: 'Hotel Imperial Wien'
address: 'Kärntner Ring 16, 1015 Wien'
city: Wien
postal_code: '1010'
lat: 48.2082
lng: 16.3739
distance_km: null
schedule:
start_date: '2027-02-09'
end_date: '2027-02-10'
shift_start_time: '22:00:00'
shift_end_time: '06:00:00'
shift_type: night
shift_type_label: Nachtschicht
duration_hours: 8
compensation:
hourly_rate_gross: 25
supplements:
night_bonus: 50
holiday_bonus: 100
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 12
filled: 0
available: 12
deadlines:
application: '2027-02-04T16:18:26+00:00'
created_at: '2026-08-05T16:18:26+00:00'
is_saved: false
can_apply: true
rate: null
recommendation:
score: 60
reasons:
- 'Passt zu Ihren Qualifikationen'
breakdown:
location: 50
qualifications: 100
category_history: 0
company_rating: 50
reliability: 100
-
job:
id: 019fd2b8-1414-7267-ab60-1d28e4726b22
title: 'Oktoberfest Kellner'
description: 'Wir suchen motivierte Oktoberfest Kellner für unser engagiertes Team. Sie unterstützen uns bei der professionellen Gästebetreuung und sorgen für ein unvergessliches Erlebnis. Vorkenntnisse in der Gastronomie sind von Vorteil, aber nicht zwingend erforderlich.'
status: active
is_featured: false
category:
id: 019fd2b7-f371-732c-8cdb-6de13be42891
slug: gastro
name: Gastronomie
name_localized: Gastronomy
icon: utensils
color: null
tags:
- Gastronomy
- Tagschicht
- 'HACCP Kenntnisse von Vorteil'
organization:
id: 019fd2b8-000d-719b-a73e-71665713a4fc
name: 'Supermarkt AG'
logo_url: null
average_rating: null
location:
name: 'Zelte Messe Graz'
address: 'Messeplatz 1, 8010 Graz'
city: Graz
postal_code: '8010'
lat: 47.0707
lng: 15.4395
distance_km: null
schedule:
start_date: '2026-11-13'
end_date: '2026-11-23'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 15
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 25
filled: 0
available: 25
deadlines:
application: '2026-11-10T16:18:26+00:00'
created_at: '2026-08-05T16:18:26+00:00'
is_saved: false
can_apply: true
rate: null
recommendation:
score: 60
reasons:
- 'Passt zu Ihren Qualifikationen'
breakdown:
location: 50
qualifications: 100
category_history: 0
company_rating: 50
reliability: 100
-
job:
id: 019fd2b8-1432-72a1-8757-db2b167892ea
title: 'Pop-Up Restaurant Service'
description: 'Wir suchen motivierte Pop-Up Restaurant Service für unser engagiertes Team. Sie unterstützen uns bei der professionellen Gästebetreuung und sorgen für ein unvergessliches Erlebnis. Vorkenntnisse in der Gastronomie sind von Vorteil, aber nicht zwingend erforderlich.'
status: active
is_featured: false
category:
id: 019fd2b7-f371-732c-8cdb-6de13be42891
slug: gastro
name: Gastronomie
name_localized: Gastronomy
icon: utensils
color: null
tags:
- Gastronomy
- Tagschicht
- 'HACCP Kenntnisse von Vorteil'
organization:
id: 019fd2b7-fad7-719c-887a-a0f510bbd31d
name: 'IT Solutions GmbH'
logo_url: null
average_rating: null
location:
name: 'Temporary Dining Wien'
address: 'Mariahilfer Straße 125, 1060 Wien'
city: Wien
postal_code: '1060'
lat: 48.1985
lng: 16.359
distance_km: null
schedule:
start_date: '2026-09-04'
end_date: '2026-10-04'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 14
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 6
filled: 0
available: 6
deadlines:
application: '2026-09-02T16:18:26+00:00'
created_at: '2026-08-05T16:18:26+00:00'
is_saved: false
can_apply: true
rate: null
recommendation:
score: 60
reasons:
- 'Passt zu Ihren Qualifikationen'
breakdown:
location: 50
qualifications: 100
category_history: 0
company_rating: 50
reliability: 100
-
job:
id: 019fd2b8-1441-71c8-a069-cb0d50c6165e
title: 'Bierstandl Heuriger'
description: 'Wir suchen motivierte Bierstandl Heuriger für unser engagiertes Team. Sie unterstützen uns bei der professionellen Gästebetreuung und sorgen für ein unvergessliches Erlebnis. Vorkenntnisse in der Gastronomie sind von Vorteil, aber nicht zwingend erforderlich.'
status: active
is_featured: false
category:
id: 019fd2b7-f371-732c-8cdb-6de13be42891
slug: gastro
name: Gastronomie
name_localized: Gastronomy
icon: utensils
color: null
tags:
- Gastronomy
- Tagschicht
- 'HACCP Kenntnisse von Vorteil'
organization:
id: 019fd2b7-f768-7325-b254-280a67b1a995
name: 'Retail Services GmbH'
logo_url: null
average_rating: null
location:
name: 'Heuriger Mayer am Pfarrplatz'
address: 'Pfarrplatz 2, 1190 Wien'
city: Wien
postal_code: '1190'
lat: 48.26
lng: 16.34
distance_km: null
schedule:
start_date: '2026-08-25'
end_date: '2027-01-02'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 13.5
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 4
filled: 0
available: 4
deadlines:
application: '2026-08-21T16:18:26+00:00'
created_at: '2026-08-05T16:18:27+00:00'
is_saved: false
can_apply: true
rate: null
recommendation:
score: 60
reasons:
- 'Passt zu Ihren Qualifikationen'
breakdown:
location: 50
qualifications: 100
category_history: 0
company_rating: 50
reliability: 100
-
job:
id: 019fd2b8-147c-7006-b991-64f8acb70696
title: Nachtportier
description: 'Wir suchen engagierte Nachtportier zur Verstärkung unseres Teams. Sie erwartet ein abwechslungsreiches Aufgabengebiet in einem dynamischen Umfeld.'
status: active
is_featured: false
category:
id: 019fd2b7-f375-724e-84b8-4f9647ef6419
slug: hotel
name: Hotellerie
name_localized: Hospitality
icon: hotel
color: null
tags:
- Hospitality
- Nachtschicht
organization:
id: 019fd2b7-fd7d-724b-8a64-b4836c66d92f
name: 'Catering Deluxe GmbH'
logo_url: null
average_rating: null
location:
name: 'NH Salzburg City'
address: 'Franz-Josef-Straße 26, 5020 Salzburg'
city: Salzburg
postal_code: '5020'
lat: 47.8063
lng: 13.0477
distance_km: null
schedule:
start_date: '2026-08-12'
end_date: '2027-02-01'
shift_start_time: '22:00:00'
shift_end_time: '06:00:00'
shift_type: night
shift_type_label: Nachtschicht
duration_hours: 8
compensation:
hourly_rate_gross: 15.5
supplements:
night_bonus: 15
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 2
filled: 0
available: 2
deadlines:
application: '2026-08-10T16:18:26+00:00'
created_at: '2026-08-05T16:18:27+00:00'
is_saved: false
can_apply: true
rate: null
recommendation:
score: 60
reasons:
- 'Passt zu Ihren Qualifikationen'
breakdown:
location: 50
qualifications: 100
category_history: 0
company_rating: 50
reliability: 100
-
job:
id: 019fd2b8-1492-71be-933a-093e7178ae22
title: 'Room Service Mitarbeiter'
description: 'Wir suchen engagierte Room Service Mitarbeiter zur Verstärkung unseres Teams. Sie erwartet ein abwechslungsreiches Aufgabengebiet in einem dynamischen Umfeld.'
status: active
is_featured: false
category:
id: 019fd2b7-f375-724e-84b8-4f9647ef6419
slug: hotel
name: Hotellerie
name_localized: Hospitality
icon: hotel
color: null
tags:
- Hospitality
- Tagschicht
organization:
id: 019fd2b7-f842-71ba-a318-a919a24d4bcf
name: 'Hotel & Spa Imperial'
logo_url: null
average_rating: null
location:
name: 'Hilton Vienna City'
address: 'Am Stadtpark 3, 1030 Wien'
city: Wien
postal_code: '1030'
lat: 48.2006
lng: 16.3882
distance_km: null
schedule:
start_date: '2026-08-10'
end_date: '2026-11-03'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 14
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 4
filled: 0
available: 4
deadlines:
application: '2026-08-06T16:18:26+00:00'
created_at: '2026-08-05T16:18:27+00:00'
is_saved: false
can_apply: true
rate: null
recommendation:
score: 60
reasons:
- 'Passt zu Ihren Qualifikationen'
breakdown:
location: 50
qualifications: 100
category_history: 0
company_rating: 50
reliability: 100
-
job:
id: 019fd2b8-14a4-7258-8b10-6da8b27fb862
title: 'Spa-Mitarbeiter*in'
description: 'Wir suchen engagierte Spa-Mitarbeiter*in zur Verstärkung unseres Teams. Sie erwartet ein abwechslungsreiches Aufgabengebiet in einem dynamischen Umfeld.'
status: active
is_featured: false
category:
id: 019fd2b7-f375-724e-84b8-4f9647ef6419
slug: hotel
name: Hotellerie
name_localized: Hospitality
icon: hotel
color: null
tags:
- Hospitality
- Tagschicht
organization:
id: 019fd2b7-f842-71ba-a318-a919a24d4bcf
name: 'Hotel & Spa Imperial'
logo_url: null
average_rating: null
location:
name: 'Schlosshotel Fuschl'
address: 'Schlossstraße 19, 5322 Hof bei Salzburg'
city: Salzburg
postal_code: '5020'
lat: 47.8095
lng: 13.055
distance_km: null
schedule:
start_date: '2026-08-15'
end_date: '2026-10-04'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 14.5
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 2
filled: 0
available: 2
deadlines:
application: '2026-08-13T16:18:26+00:00'
created_at: '2026-08-05T16:18:27+00:00'
is_saved: false
can_apply: true
rate: null
recommendation:
score: 60
reasons:
- 'Passt zu Ihren Qualifikationen'
breakdown:
location: 50
qualifications: 100
category_history: 0
company_rating: 50
reliability: 100
-
job:
id: 019fd2b8-1547-703f-bfe4-177b0923bd1d
title: 'Concierge Nightshift'
description: 'Wir suchen engagierte Concierge Nightshift zur Verstärkung unseres Teams. Sie erwartet ein abwechslungsreiches Aufgabengebiet in einem dynamischen Umfeld.'
status: active
is_featured: false
category:
id: 019fd2b7-f375-724e-84b8-4f9647ef6419
slug: hotel
name: Hotellerie
name_localized: Hospitality
icon: hotel
color: null
tags:
- Hospitality
- Nachtschicht
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
logo_url: null
average_rating: null
location:
name: 'Grand Hotel Wien'
address: 'Kärntner Ring 9, 1010 Wien'
city: Wien
postal_code: '1010'
lat: 48.2082
lng: 16.3739
distance_km: null
schedule:
start_date: '2026-08-20'
end_date: '2027-08-05'
shift_start_time: '22:00:00'
shift_end_time: '06:00:00'
shift_type: night
shift_type_label: Nachtschicht
duration_hours: 8
compensation:
hourly_rate_gross: 16
supplements:
night_bonus: 20
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 1
filled: 0
available: 1
deadlines:
application: '2026-08-17T16:18:26+00:00'
created_at: '2026-08-05T16:18:27+00:00'
is_saved: false
can_apply: true
rate: null
recommendation:
score: 60
reasons:
- 'Passt zu Ihren Qualifikationen'
breakdown:
location: 50
qualifications: 100
category_history: 0
company_rating: 50
reliability: 100
-
job:
id: 019fd2b8-1560-70a6-abb3-020a87eccbc2
title: 'Eventhelfer*in Musikfestival'
description: 'Für unsere bevorstehende Veranstaltung suchen wir tatkräftige Unterstützung. Als Eventhelfer*in Musikfestival sind Sie das Aushängeschild unserer Veranstaltung und sorgen für einen reibungslosen Ablauf.'
status: active
is_featured: false
category:
id: 019fd2b7-f398-7300-a216-c64584fea8f7
slug: event
name: Events
name_localized: Events
icon: calendar-star
color: null
tags:
- Events
- Tagschicht
organization:
id: 019fd2b7-fbb4-73fa-b801-e0c8a8de2651
name: 'Bauwerk GmbH'
logo_url: null
average_rating: null
location:
name: 'Donauinsel Festival'
address: 'Donauinsel, 1020 Wien'
city: Wien
postal_code: '1020'
lat: 48.2112
lng: 16.4184
distance_km: null
schedule:
start_date: '2026-10-04'
end_date: '2026-10-07'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 14
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 50
filled: 0
available: 50
deadlines:
application: '2026-10-02T16:18:26+00:00'
created_at: '2026-08-05T16:18:27+00:00'
is_saved: false
can_apply: true
rate: null
recommendation:
score: 60
reasons:
- 'Passt zu Ihren Qualifikationen'
breakdown:
location: 50
qualifications: 100
category_history: 0
company_rating: 50
reliability: 100
meta:
type: object
properties:
total:
type: integer
examples:
- 20
algorithm_version:
type: string
examples:
- '1.0'
examples:
-
status: SUCCESS
data:
recommendations:
-
job:
id: 019fd2b8-1a90-7125-af02-72f37fef65ea
title: 'Backoffice Assistenz'
description: 'Wir suchen engagierte Backoffice Assistenz zur Verstärkung unseres Teams. Sie erwartet ein abwechslungsreiches Aufgabengebiet in einem dynamischen Umfeld.'
status: active
is_featured: false
category:
id: 019fd2b7-f39f-73e6-870b-fe7584e4f9bc
slug: office
name: Büro
name_localized: Office
icon: briefcase
color: null
tags:
- Office
- Tagschicht
organization:
id: 019fd2b7-f768-7325-b254-280a67b1a995
name: 'Retail Services GmbH'
logo_url: null
average_rating: null
location:
name: 'Steuerberatung Wien'
address: 'Margaretenstraße 90, 1050 Wien'
city: Wien
postal_code: '1050'
lat: 48.1944
lng: 16.3585
distance_km: null
schedule:
start_date: '2026-08-15'
end_date: '2026-09-04'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 16
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 1
filled: 0
available: 1
deadlines:
application: '2026-08-10T16:18:26+00:00'
created_at: '2026-08-05T16:18:28+00:00'
is_saved: false
can_apply: true
rate: null
recommendation:
score: 61.5
reasons:
- 'Passt zu Ihren Qualifikationen'
breakdown:
location: 50
qualifications: 100
category_history: 10
company_rating: 50
reliability: 100
-
job:
id: 019fd2b8-1265-737c-ae21-e5265dc709d8
title: 'Servicekraft Restaurant Mitte'
description: 'Wir suchen motivierte Servicekraft Restaurant Mitte für unser engagiertes Team. Sie unterstützen uns bei der professionellen Gästebetreuung und sorgen für ein unvergessliches Erlebnis. Vorkenntnisse in der Gastronomie sind von Vorteil, aber nicht zwingend erforderlich.'
status: active
is_featured: false
category:
id: 019fd2b7-f371-732c-8cdb-6de13be42891
slug: gastro
name: Gastronomie
name_localized: Gastronomy
icon: utensils
color: null
tags:
- Gastronomy
- Tagschicht
- 'HACCP Kenntnisse von Vorteil'
organization:
id: 019fd2b7-ff32-7117-ab28-06e2d3082002
name: 'Bildungszentrum Mitte'
logo_url: null
average_rating: null
location:
name: 'Brasserie Mitte'
address: 'Schwarzenbergplatz 3, 1010 Wien'
city: Wien
postal_code: '1010'
lat: 48.2082
lng: 16.3739
distance_km: null
schedule:
start_date: '2026-08-10'
end_date: '2026-09-09'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 14.5
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 8
filled: 0
available: 8
deadlines:
application: '2026-08-07T16:18:26+00:00'
created_at: '2026-08-05T16:18:26+00:00'
is_saved: false
can_apply: true
rate: null
recommendation:
score: 60
reasons:
- 'Passt zu Ihren Qualifikationen'
breakdown:
location: 50
qualifications: 100
category_history: 0
company_rating: 50
reliability: 100
-
job:
id: 019fd2b8-1287-7146-a673-6798f3d03acc
title: 'Barkeeper Spätschicht Club'
description: 'Wir suchen motivierte Barkeeper Spätschicht Club für unser engagiertes Team. Sie unterstützen uns bei der professionellen Gästebetreuung und sorgen für ein unvergessliches Erlebnis. Vorkenntnisse in der Gastronomie sind von Vorteil, aber nicht zwingend erforderlich.'
status: active
is_featured: false
category:
id: 019fd2b7-f371-732c-8cdb-6de13be42891
slug: gastro
name: Gastronomie
name_localized: Gastronomy
icon: utensils
color: null
tags:
- Gastronomy
- Nachtschicht
- 'HACCP Kenntnisse von Vorteil'
organization:
id: 019fd2b7-f5ae-7390-a778-c08c8d56cdc0
name: 'Event Solutions Austria'
logo_url: null
average_rating: null
location:
name: 'Club Passage'
address: 'Babenbergerstraße 9, 1010 Wien'
city: Wien
postal_code: '1070'
lat: 48.2003
lng: 16.3465
distance_km: null
schedule:
start_date: '2026-08-08'
end_date: '2026-11-03'
shift_start_time: '22:00:00'
shift_end_time: '06:00:00'
shift_type: night
shift_type_label: Nachtschicht
duration_hours: 8
compensation:
hourly_rate_gross: 16
supplements:
night_bonus: 15
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 4
filled: 0
available: 4
deadlines:
application: '2026-08-06T16:18:26+00:00'
created_at: '2026-08-05T16:18:26+00:00'
is_saved: false
can_apply: true
rate: null
recommendation:
score: 60
reasons:
- 'Passt zu Ihren Qualifikationen'
breakdown:
location: 50
qualifications: 100
category_history: 0
company_rating: 50
reliability: 100
-
job:
id: 019fd2b8-1298-737e-bbfd-295992feb4db
title: 'Küchenhilfe Großküche'
description: 'Wir suchen motivierte Küchenhilfe Großküche für unser engagiertes Team. Sie unterstützen uns bei der professionellen Gästebetreuung und sorgen für ein unvergessliches Erlebnis. Vorkenntnisse in der Gastronomie sind von Vorteil, aber nicht zwingend erforderlich.'
status: active
is_featured: false
category:
id: 019fd2b7-f371-732c-8cdb-6de13be42891
slug: gastro
name: Gastronomie
name_localized: Gastronomy
icon: utensils
color: null
tags:
- Gastronomy
- Tagschicht
- 'HACCP Kenntnisse von Vorteil'
organization:
id: 019fd2b7-fad7-719c-887a-a0f510bbd31d
name: 'IT Solutions GmbH'
logo_url: null
average_rating: null
location:
name: 'SV Gastronomie Wien'
address: 'Gablenzgasse 11, 1150 Wien'
city: Wien
postal_code: '1150'
lat: 48.196
lng: 16.3268
distance_km: null
schedule:
start_date: '2026-08-12'
end_date: '2026-12-03'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 13.5
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 10
filled: 0
available: 10
deadlines:
application: '2026-08-07T16:18:26+00:00'
created_at: '2026-08-05T16:18:26+00:00'
is_saved: false
can_apply: true
rate: null
recommendation:
score: 60
reasons:
- 'Passt zu Ihren Qualifikationen'
breakdown:
location: 50
qualifications: 100
category_history: 0
company_rating: 50
reliability: 100
-
job:
id: 019fd2b8-12b2-72ff-8be7-dadbf8e167b6
title: 'Kellner*in Haubenrestaurant'
description: 'Wir suchen motivierte Kellner*in Haubenrestaurant für unser engagiertes Team. Sie unterstützen uns bei der professionellen Gästebetreuung und sorgen für ein unvergessliches Erlebnis. Vorkenntnisse in der Gastronomie sind von Vorteil, aber nicht zwingend erforderlich.'
status: active
is_featured: false
category:
id: 019fd2b7-f371-732c-8cdb-6de13be42891
slug: gastro
name: Gastronomie
name_localized: Gastronomy
icon: utensils
color: null
tags:
- Gastronomy
- Tagschicht
- 'HACCP Kenntnisse von Vorteil'
organization:
id: 019fd2b7-fca6-71cf-8683-c97f6f50a24a
name: 'Reinigungsservice Alpin'
logo_url: null
average_rating: null
location:
name: 'Restaurant Steirereck'
address: 'Am Heumarkt 2a, 1030 Wien'
city: Wien
postal_code: '1030'
lat: 48.2014
lng: 16.387
distance_km: null
schedule:
start_date: '2026-08-15'
end_date: '2026-10-04'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 15.5
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 3
filled: 0
available: 3
deadlines:
application: '2026-08-10T16:18:26+00:00'
created_at: '2026-08-05T16:18:26+00:00'
is_saved: false
can_apply: true
rate: null
recommendation:
score: 60
reasons:
- 'Passt zu Ihren Qualifikationen'
breakdown:
location: 50
qualifications: 100
category_history: 0
company_rating: 50
reliability: 100
-
job:
id: 019fd2b8-12c7-72ab-bd18-53060b989f57
title: 'Buffetkraft Messe'
description: 'Wir suchen motivierte Buffetkraft Messe für unser engagiertes Team. Sie unterstützen uns bei der professionellen Gästebetreuung und sorgen für ein unvergessliches Erlebnis. Vorkenntnisse in der Gastronomie sind von Vorteil, aber nicht zwingend erforderlich.'
status: active
is_featured: false
category:
id: 019fd2b7-f371-732c-8cdb-6de13be42891
slug: gastro
name: Gastronomie
name_localized: Gastronomy
icon: utensils
color: null
tags:
- Gastronomy
- Tagschicht
- 'HACCP Kenntnisse von Vorteil'
organization:
id: 019fd2b7-fe56-70d1-bb3a-641339ce636a
name: 'Lagerhaus Steiermark'
logo_url: null
average_rating: null
location:
name: 'Reed Messe Wien'
address: 'Messeplatz 1, 1021 Wien'
city: Wien
postal_code: '1020'
lat: 48.2176
lng: 16.4138
distance_km: null
schedule:
start_date: '2026-08-19'
end_date: '2026-08-21'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 13.8
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 15
filled: 0
available: 15
deadlines:
application: '2026-08-15T16:18:26+00:00'
created_at: '2026-08-05T16:18:26+00:00'
is_saved: false
can_apply: true
rate: null
recommendation:
score: 60
reasons:
- 'Passt zu Ihren Qualifikationen'
breakdown:
location: 50
qualifications: 100
category_history: 0
company_rating: 50
reliability: 100
-
job:
id: 019fd2b8-12d6-722c-8511-2aaa42b3d821
title: 'Servicepersonal Weinbar'
description: 'Wir suchen motivierte Servicepersonal Weinbar für unser engagiertes Team. Sie unterstützen uns bei der professionellen Gästebetreuung und sorgen für ein unvergessliches Erlebnis. Vorkenntnisse in der Gastronomie sind von Vorteil, aber nicht zwingend erforderlich.'
status: active
is_featured: false
category:
id: 019fd2b7-f371-732c-8cdb-6de13be42891
slug: gastro
name: Gastronomie
name_localized: Gastronomy
icon: utensils
color: null
tags:
- Gastronomy
- Tagschicht
- 'HACCP Kenntnisse von Vorteil'
organization:
id: 019fd2b8-000d-719b-a73e-71665713a4fc
name: 'Supermarkt AG'
logo_url: null
average_rating: null
location:
name: 'Weinbar Graz'
address: 'Herrengasse 5, 8010 Graz'
city: Graz
postal_code: '8010'
lat: 47.0707
lng: 15.4395
distance_km: null
schedule:
start_date: '2026-08-09'
end_date: '2027-02-01'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 14
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 5
filled: 0
available: 5
deadlines:
application: '2026-08-07T16:18:26+00:00'
created_at: '2026-08-05T16:18:26+00:00'
is_saved: false
can_apply: true
rate: null
recommendation:
score: 60
reasons:
- 'Passt zu Ihren Qualifikationen'
breakdown:
location: 50
qualifications: 100
category_history: 0
company_rating: 50
reliability: 100
-
job:
id: 019fd2b8-12f4-73f7-a675-8bf7331044c3
title: 'Koch/Köchin Bistro'
description: 'Wir suchen motivierte Koch/Köchin Bistro für unser engagiertes Team. Sie unterstützen uns bei der professionellen Gästebetreuung und sorgen für ein unvergessliches Erlebnis. Vorkenntnisse in der Gastronomie sind von Vorteil, aber nicht zwingend erforderlich.'
status: active
is_featured: false
category:
id: 019fd2b7-f371-732c-8cdb-6de13be42891
slug: gastro
name: Gastronomie
name_localized: Gastronomy
icon: utensils
color: null
tags:
- Gastronomy
- Tagschicht
- 'HACCP Kenntnisse von Vorteil'
organization:
id: 019fd2b7-f4d3-71a1-89d4-ca7d5731b32a
name: 'Wiener Gastro GmbH'
logo_url: null
average_rating: null
location:
name: 'Bistro Donau'
address: 'Landstraße 30, 4020 Linz'
city: Linz
postal_code: '4020'
lat: 48.3069
lng: 14.2858
distance_km: null
schedule:
start_date: '2026-08-17'
end_date: '2026-11-03'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 15.8
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 2
filled: 0
available: 2
deadlines:
application: '2026-08-14T16:18:26+00:00'
created_at: '2026-08-05T16:18:26+00:00'
is_saved: false
can_apply: true
rate: null
recommendation:
score: 60
reasons:
- 'Passt zu Ihren Qualifikationen'
breakdown:
location: 50
qualifications: 100
category_history: 0
company_rating: 50
reliability: 100
-
job:
id: 019fd2b8-130c-7006-942a-09ca3ab2b639
title: 'Bankettkellner Festsaal'
description: 'Wir suchen motivierte Bankettkellner Festsaal für unser engagiertes Team. Sie unterstützen uns bei der professionellen Gästebetreuung und sorgen für ein unvergessliches Erlebnis. Vorkenntnisse in der Gastronomie sind von Vorteil, aber nicht zwingend erforderlich.'
status: active
is_featured: false
category:
id: 019fd2b7-f371-732c-8cdb-6de13be42891
slug: gastro
name: Gastronomie
name_localized: Gastronomy
icon: utensils
color: null
tags:
- Gastronomy
- Tagschicht
- 'HACCP Kenntnisse von Vorteil'
organization:
id: 019fd2b7-fca6-71cf-8683-c97f6f50a24a
name: 'Reinigungsservice Alpin'
logo_url: null
average_rating: null
location:
name: 'Schlosshotel Mirabell'
address: 'Mirabellplatz 2, 5020 Salzburg'
city: Salzburg
postal_code: '5020'
lat: 47.8095
lng: 13.055
distance_km: null
schedule:
start_date: '2026-08-13'
end_date: '2026-09-19'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 14.8
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 8
filled: 0
available: 8
deadlines:
application: '2026-08-10T16:18:26+00:00'
created_at: '2026-08-05T16:18:26+00:00'
is_saved: false
can_apply: true
rate: null
recommendation:
score: 60
reasons:
- 'Passt zu Ihren Qualifikationen'
breakdown:
location: 50
qualifications: 100
category_history: 0
company_rating: 50
reliability: 100
-
job:
id: 019fd2b8-13e2-7390-a987-e12b987cdbb8
title: 'Weihnachtsmarkt Servicekraft'
description: 'Wir suchen motivierte Weihnachtsmarkt Servicekraft für unser engagiertes Team. Sie unterstützen uns bei der professionellen Gästebetreuung und sorgen für ein unvergessliches Erlebnis. Vorkenntnisse in der Gastronomie sind von Vorteil, aber nicht zwingend erforderlich.'
status: active
is_featured: false
category:
id: 019fd2b7-f371-732c-8cdb-6de13be42891
slug: gastro
name: Gastronomie
name_localized: Gastronomy
icon: utensils
color: null
tags:
- Gastronomy
- Tagschicht
- 'HACCP Kenntnisse von Vorteil'
organization:
id: 019fd2b7-f91f-70cb-8409-8632db9df3c7
name: 'Sicherheitsdienst Österreich'
logo_url: null
average_rating: null
location:
name: 'Christkindlmarkt Rathausplatz'
address: 'Rathausplatz 1, 1010 Wien'
city: Wien
postal_code: '1010'
lat: 48.2082
lng: 16.3739
distance_km: null
schedule:
start_date: '2027-01-02'
end_date: '2027-02-01'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 14
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 30
filled: 0
available: 30
deadlines:
application: '2026-12-29T16:18:26+00:00'
created_at: '2026-08-05T16:18:26+00:00'
is_saved: false
can_apply: true
rate: null
recommendation:
score: 60
reasons:
- 'Passt zu Ihren Qualifikationen'
breakdown:
location: 50
qualifications: 100
category_history: 0
company_rating: 50
reliability: 100
-
job:
id: 019fd2b8-14dd-7377-92d2-447578550d00
title: 'Convention Coordinator'
description: 'Wir suchen engagierte Convention Coordinator zur Verstärkung unseres Teams. Sie erwartet ein abwechslungsreiches Aufgabengebiet in einem dynamischen Umfeld.'
status: active
is_featured: false
category:
id: 019fd2b7-f375-724e-84b8-4f9647ef6419
slug: hotel
name: Hotellerie
name_localized: Hospitality
icon: hotel
color: null
tags:
- Hospitality
- Tagschicht
organization:
id: 019fd2b8-000d-719b-a73e-71665713a4fc
name: 'Supermarkt AG'
logo_url: null
average_rating: null
location:
name: 'Austria Center Vienna'
address: 'Bruno-Kreisky-Platz 1, 1220 Wien'
city: Wien
postal_code: '1010'
lat: 48.2082
lng: 16.3739
distance_km: null
schedule:
start_date: '2026-08-25'
end_date: '2026-08-30'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 18
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 5
filled: 0
available: 5
deadlines:
application: '2026-08-23T16:18:26+00:00'
created_at: '2026-08-05T16:18:27+00:00'
is_saved: false
can_apply: true
rate: null
recommendation:
score: 60
reasons:
- 'Passt zu Ihren Qualifikationen'
breakdown:
location: 50
qualifications: 100
category_history: 0
company_rating: 50
reliability: 100
-
job:
id: 019fd2b8-1405-709f-bca9-b0a418fb6a75
title: 'Silvesternacht Service'
description: 'Wir suchen motivierte Silvesternacht Service für unser engagiertes Team. Sie unterstützen uns bei der professionellen Gästebetreuung und sorgen für ein unvergessliches Erlebnis. Vorkenntnisse in der Gastronomie sind von Vorteil, aber nicht zwingend erforderlich.'
status: active
is_featured: false
category:
id: 019fd2b7-f371-732c-8cdb-6de13be42891
slug: gastro
name: Gastronomie
name_localized: Gastronomy
icon: utensils
color: null
tags:
- Gastronomy
- Nachtschicht
- 'HACCP Kenntnisse von Vorteil'
organization:
id: 019fd2b7-fe56-70d1-bb3a-641339ce636a
name: 'Lagerhaus Steiermark'
logo_url: null
average_rating: null
location:
name: 'Hotel Imperial Wien'
address: 'Kärntner Ring 16, 1015 Wien'
city: Wien
postal_code: '1010'
lat: 48.2082
lng: 16.3739
distance_km: null
schedule:
start_date: '2027-02-09'
end_date: '2027-02-10'
shift_start_time: '22:00:00'
shift_end_time: '06:00:00'
shift_type: night
shift_type_label: Nachtschicht
duration_hours: 8
compensation:
hourly_rate_gross: 25
supplements:
night_bonus: 50
holiday_bonus: 100
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 12
filled: 0
available: 12
deadlines:
application: '2027-02-04T16:18:26+00:00'
created_at: '2026-08-05T16:18:26+00:00'
is_saved: false
can_apply: true
rate: null
recommendation:
score: 60
reasons:
- 'Passt zu Ihren Qualifikationen'
breakdown:
location: 50
qualifications: 100
category_history: 0
company_rating: 50
reliability: 100
-
job:
id: 019fd2b8-1414-7267-ab60-1d28e4726b22
title: 'Oktoberfest Kellner'
description: 'Wir suchen motivierte Oktoberfest Kellner für unser engagiertes Team. Sie unterstützen uns bei der professionellen Gästebetreuung und sorgen für ein unvergessliches Erlebnis. Vorkenntnisse in der Gastronomie sind von Vorteil, aber nicht zwingend erforderlich.'
status: active
is_featured: false
category:
id: 019fd2b7-f371-732c-8cdb-6de13be42891
slug: gastro
name: Gastronomie
name_localized: Gastronomy
icon: utensils
color: null
tags:
- Gastronomy
- Tagschicht
- 'HACCP Kenntnisse von Vorteil'
organization:
id: 019fd2b8-000d-719b-a73e-71665713a4fc
name: 'Supermarkt AG'
logo_url: null
average_rating: null
location:
name: 'Zelte Messe Graz'
address: 'Messeplatz 1, 8010 Graz'
city: Graz
postal_code: '8010'
lat: 47.0707
lng: 15.4395
distance_km: null
schedule:
start_date: '2026-11-13'
end_date: '2026-11-23'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 15
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 25
filled: 0
available: 25
deadlines:
application: '2026-11-10T16:18:26+00:00'
created_at: '2026-08-05T16:18:26+00:00'
is_saved: false
can_apply: true
rate: null
recommendation:
score: 60
reasons:
- 'Passt zu Ihren Qualifikationen'
breakdown:
location: 50
qualifications: 100
category_history: 0
company_rating: 50
reliability: 100
-
job:
id: 019fd2b8-1432-72a1-8757-db2b167892ea
title: 'Pop-Up Restaurant Service'
description: 'Wir suchen motivierte Pop-Up Restaurant Service für unser engagiertes Team. Sie unterstützen uns bei der professionellen Gästebetreuung und sorgen für ein unvergessliches Erlebnis. Vorkenntnisse in der Gastronomie sind von Vorteil, aber nicht zwingend erforderlich.'
status: active
is_featured: false
category:
id: 019fd2b7-f371-732c-8cdb-6de13be42891
slug: gastro
name: Gastronomie
name_localized: Gastronomy
icon: utensils
color: null
tags:
- Gastronomy
- Tagschicht
- 'HACCP Kenntnisse von Vorteil'
organization:
id: 019fd2b7-fad7-719c-887a-a0f510bbd31d
name: 'IT Solutions GmbH'
logo_url: null
average_rating: null
location:
name: 'Temporary Dining Wien'
address: 'Mariahilfer Straße 125, 1060 Wien'
city: Wien
postal_code: '1060'
lat: 48.1985
lng: 16.359
distance_km: null
schedule:
start_date: '2026-09-04'
end_date: '2026-10-04'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 14
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 6
filled: 0
available: 6
deadlines:
application: '2026-09-02T16:18:26+00:00'
created_at: '2026-08-05T16:18:26+00:00'
is_saved: false
can_apply: true
rate: null
recommendation:
score: 60
reasons:
- 'Passt zu Ihren Qualifikationen'
breakdown:
location: 50
qualifications: 100
category_history: 0
company_rating: 50
reliability: 100
-
job:
id: 019fd2b8-1441-71c8-a069-cb0d50c6165e
title: 'Bierstandl Heuriger'
description: 'Wir suchen motivierte Bierstandl Heuriger für unser engagiertes Team. Sie unterstützen uns bei der professionellen Gästebetreuung und sorgen für ein unvergessliches Erlebnis. Vorkenntnisse in der Gastronomie sind von Vorteil, aber nicht zwingend erforderlich.'
status: active
is_featured: false
category:
id: 019fd2b7-f371-732c-8cdb-6de13be42891
slug: gastro
name: Gastronomie
name_localized: Gastronomy
icon: utensils
color: null
tags:
- Gastronomy
- Tagschicht
- 'HACCP Kenntnisse von Vorteil'
organization:
id: 019fd2b7-f768-7325-b254-280a67b1a995
name: 'Retail Services GmbH'
logo_url: null
average_rating: null
location:
name: 'Heuriger Mayer am Pfarrplatz'
address: 'Pfarrplatz 2, 1190 Wien'
city: Wien
postal_code: '1190'
lat: 48.26
lng: 16.34
distance_km: null
schedule:
start_date: '2026-08-25'
end_date: '2027-01-02'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 13.5
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 4
filled: 0
available: 4
deadlines:
application: '2026-08-21T16:18:26+00:00'
created_at: '2026-08-05T16:18:27+00:00'
is_saved: false
can_apply: true
rate: null
recommendation:
score: 60
reasons:
- 'Passt zu Ihren Qualifikationen'
breakdown:
location: 50
qualifications: 100
category_history: 0
company_rating: 50
reliability: 100
-
job:
id: 019fd2b8-147c-7006-b991-64f8acb70696
title: Nachtportier
description: 'Wir suchen engagierte Nachtportier zur Verstärkung unseres Teams. Sie erwartet ein abwechslungsreiches Aufgabengebiet in einem dynamischen Umfeld.'
status: active
is_featured: false
category:
id: 019fd2b7-f375-724e-84b8-4f9647ef6419
slug: hotel
name: Hotellerie
name_localized: Hospitality
icon: hotel
color: null
tags:
- Hospitality
- Nachtschicht
organization:
id: 019fd2b7-fd7d-724b-8a64-b4836c66d92f
name: 'Catering Deluxe GmbH'
logo_url: null
average_rating: null
location:
name: 'NH Salzburg City'
address: 'Franz-Josef-Straße 26, 5020 Salzburg'
city: Salzburg
postal_code: '5020'
lat: 47.8063
lng: 13.0477
distance_km: null
schedule:
start_date: '2026-08-12'
end_date: '2027-02-01'
shift_start_time: '22:00:00'
shift_end_time: '06:00:00'
shift_type: night
shift_type_label: Nachtschicht
duration_hours: 8
compensation:
hourly_rate_gross: 15.5
supplements:
night_bonus: 15
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 2
filled: 0
available: 2
deadlines:
application: '2026-08-10T16:18:26+00:00'
created_at: '2026-08-05T16:18:27+00:00'
is_saved: false
can_apply: true
rate: null
recommendation:
score: 60
reasons:
- 'Passt zu Ihren Qualifikationen'
breakdown:
location: 50
qualifications: 100
category_history: 0
company_rating: 50
reliability: 100
-
job:
id: 019fd2b8-1492-71be-933a-093e7178ae22
title: 'Room Service Mitarbeiter'
description: 'Wir suchen engagierte Room Service Mitarbeiter zur Verstärkung unseres Teams. Sie erwartet ein abwechslungsreiches Aufgabengebiet in einem dynamischen Umfeld.'
status: active
is_featured: false
category:
id: 019fd2b7-f375-724e-84b8-4f9647ef6419
slug: hotel
name: Hotellerie
name_localized: Hospitality
icon: hotel
color: null
tags:
- Hospitality
- Tagschicht
organization:
id: 019fd2b7-f842-71ba-a318-a919a24d4bcf
name: 'Hotel & Spa Imperial'
logo_url: null
average_rating: null
location:
name: 'Hilton Vienna City'
address: 'Am Stadtpark 3, 1030 Wien'
city: Wien
postal_code: '1030'
lat: 48.2006
lng: 16.3882
distance_km: null
schedule:
start_date: '2026-08-10'
end_date: '2026-11-03'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 14
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 4
filled: 0
available: 4
deadlines:
application: '2026-08-06T16:18:26+00:00'
created_at: '2026-08-05T16:18:27+00:00'
is_saved: false
can_apply: true
rate: null
recommendation:
score: 60
reasons:
- 'Passt zu Ihren Qualifikationen'
breakdown:
location: 50
qualifications: 100
category_history: 0
company_rating: 50
reliability: 100
-
job:
id: 019fd2b8-14a4-7258-8b10-6da8b27fb862
title: 'Spa-Mitarbeiter*in'
description: 'Wir suchen engagierte Spa-Mitarbeiter*in zur Verstärkung unseres Teams. Sie erwartet ein abwechslungsreiches Aufgabengebiet in einem dynamischen Umfeld.'
status: active
is_featured: false
category:
id: 019fd2b7-f375-724e-84b8-4f9647ef6419
slug: hotel
name: Hotellerie
name_localized: Hospitality
icon: hotel
color: null
tags:
- Hospitality
- Tagschicht
organization:
id: 019fd2b7-f842-71ba-a318-a919a24d4bcf
name: 'Hotel & Spa Imperial'
logo_url: null
average_rating: null
location:
name: 'Schlosshotel Fuschl'
address: 'Schlossstraße 19, 5322 Hof bei Salzburg'
city: Salzburg
postal_code: '5020'
lat: 47.8095
lng: 13.055
distance_km: null
schedule:
start_date: '2026-08-15'
end_date: '2026-10-04'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 14.5
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 2
filled: 0
available: 2
deadlines:
application: '2026-08-13T16:18:26+00:00'
created_at: '2026-08-05T16:18:27+00:00'
is_saved: false
can_apply: true
rate: null
recommendation:
score: 60
reasons:
- 'Passt zu Ihren Qualifikationen'
breakdown:
location: 50
qualifications: 100
category_history: 0
company_rating: 50
reliability: 100
-
job:
id: 019fd2b8-1547-703f-bfe4-177b0923bd1d
title: 'Concierge Nightshift'
description: 'Wir suchen engagierte Concierge Nightshift zur Verstärkung unseres Teams. Sie erwartet ein abwechslungsreiches Aufgabengebiet in einem dynamischen Umfeld.'
status: active
is_featured: false
category:
id: 019fd2b7-f375-724e-84b8-4f9647ef6419
slug: hotel
name: Hotellerie
name_localized: Hospitality
icon: hotel
color: null
tags:
- Hospitality
- Nachtschicht
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
logo_url: null
average_rating: null
location:
name: 'Grand Hotel Wien'
address: 'Kärntner Ring 9, 1010 Wien'
city: Wien
postal_code: '1010'
lat: 48.2082
lng: 16.3739
distance_km: null
schedule:
start_date: '2026-08-20'
end_date: '2027-08-05'
shift_start_time: '22:00:00'
shift_end_time: '06:00:00'
shift_type: night
shift_type_label: Nachtschicht
duration_hours: 8
compensation:
hourly_rate_gross: 16
supplements:
night_bonus: 20
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 1
filled: 0
available: 1
deadlines:
application: '2026-08-17T16:18:26+00:00'
created_at: '2026-08-05T16:18:27+00:00'
is_saved: false
can_apply: true
rate: null
recommendation:
score: 60
reasons:
- 'Passt zu Ihren Qualifikationen'
breakdown:
location: 50
qualifications: 100
category_history: 0
company_rating: 50
reliability: 100
-
job:
id: 019fd2b8-1560-70a6-abb3-020a87eccbc2
title: 'Eventhelfer*in Musikfestival'
description: 'Für unsere bevorstehende Veranstaltung suchen wir tatkräftige Unterstützung. Als Eventhelfer*in Musikfestival sind Sie das Aushängeschild unserer Veranstaltung und sorgen für einen reibungslosen Ablauf.'
status: active
is_featured: false
category:
id: 019fd2b7-f398-7300-a216-c64584fea8f7
slug: event
name: Events
name_localized: Events
icon: calendar-star
color: null
tags:
- Events
- Tagschicht
organization:
id: 019fd2b7-fbb4-73fa-b801-e0c8a8de2651
name: 'Bauwerk GmbH'
logo_url: null
average_rating: null
location:
name: 'Donauinsel Festival'
address: 'Donauinsel, 1020 Wien'
city: Wien
postal_code: '1020'
lat: 48.2112
lng: 16.4184
distance_km: null
schedule:
start_date: '2026-10-04'
end_date: '2026-10-07'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 14
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 50
filled: 0
available: 50
deadlines:
application: '2026-10-02T16:18:26+00:00'
created_at: '2026-08-05T16:18:27+00:00'
is_saved: false
can_apply: true
rate: null
recommendation:
score: 60
reasons:
- 'Passt zu Ihren Qualifikationen'
breakdown:
location: 50
qualifications: 100
category_history: 0
company_rating: 50
reliability: 100
meta:
total: 20
algorithm_version: '1.0'
tags:
- 'Mobile API'
/api/v1/mobile/applications:
get:
summary: "List the authenticated user's job applications."
operationId: listTheAuthenticatedUsersJobApplications
description: "Each row carries the application's full state — status timestamps,\nwaitlist position, scheduling-conflict details, chosen shift dates\nand shift ids, rejection reason — plus whether it can still be\nwithdrawn and, once selected, a summary of the assignments it\nproduced with any contracts still awaiting the worker's signature."
parameters:
-
in: query
name: status
description: 'string|string[] Filter by one or more application statuses. Unknown statuses are refused.'
required: false
schema:
type: string
description: 'string|string[] Filter by one or more application statuses. Unknown statuses are refused.'
examples:
- pending
-
in: query
name: per_page
description: 'Items per page (max 50).'
required: false
schema:
type: integer
description: 'Items per page (max 50).'
examples:
- 15
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
applications:
type: array
examples:
- []
pagination:
type: object
properties:
current_page:
type: integer
examples:
- 1
last_page:
type: integer
examples:
- 1
per_page:
type: integer
examples:
- 15
total:
type: integer
examples:
- 0
examples:
-
status: SUCCESS
data:
applications: []
pagination:
current_page: 1
last_page: 1
per_page: 15
total: 0
tags:
- 'Mobile API'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
status:
type: array
description: ''
items:
type: string
enum:
- pending
- shortlisted
- selected
- standby
- rejected
- withdrawn
- expired
- cancelled_by_org
- job_cancelled
examples:
-
- withdrawn
per_page:
type:
- integer
- 'null'
description: 'Must be at least 1.'
examples:
- 16
'/api/v1/mobile/applications/{applicationId}/withdraw':
post:
summary: 'Withdraw a Job Application'
operationId: withdrawAJobApplication
description: "Takes back an application the company has not decided yet. Allowed\nwhile the application is pending, shortlisted or on the waitlist; a\nselected application holds live assignments and is released by\ncancelling those shifts instead, so it cannot be withdrawn here."
parameters: []
responses:
409:
description: 'No longer withdrawable'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- INVALID_OPERATION
message:
type: string
examples:
- 'Diese Bewerbung kann nicht mehr zurückgezogen werden.'
examples:
-
status: INVALID_OPERATION
message: 'Diese Bewerbung kann nicht mehr zurückgezogen werden.'
tags:
- 'Mobile API'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
reason:
type:
- string
- 'null'
description: 'Optional reason, shown to the company.'
examples:
- 'Ich habe eine andere Stelle angenommen.'
parameters:
-
in: path
name: applicationId
description: 'The application to withdraw.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
/api/v1/mobile/shifts:
get:
summary: 'List My Shifts'
operationId: listMyShifts
description: "Returns the authenticated user's shifts (upcoming and past).\nIncludes job and organization details, compensation info, and action flags.\n\nWithout a `status` filter, expired and cancelled entries are excluded;\nrequest them explicitly via `status` to see them."
parameters:
-
in: query
name: status
description: 'Filter by shift status. One of: awaiting_signature, signed, checked_in, completed, hours_confirmed, no_show, cancelled, disputed.'
required: false
schema:
type: string
description: 'Filter by shift status. One of: awaiting_signature, signed, checked_in, completed, hours_confirmed, no_show, cancelled, disputed.'
examples:
- signed
-
in: query
name: period
description: 'Which shifts to return: upcoming (the default), past, or all.'
required: false
schema:
type: string
description: 'Which shifts to return: upcoming (the default), past, or all.'
examples:
- upcoming
-
in: query
name: per_page
description: 'Items per page (max 50).'
required: false
schema:
type: integer
description: 'Items per page (max 50).'
examples:
- 15
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
shifts:
type: array
items:
type: object
properties:
id:
type: string
examples:
- 019fd4e7-8db5-7390-a768-5cc04b8a5ecc
status:
type: string
examples:
- signed
status_label:
type: string
examples:
- Unterschrieben
shift_date:
type: string
examples:
- '2026-08-07'
scheduled_start_time:
type: string
examples:
- '08:00:00'
scheduled_end_time:
type: string
examples:
- '16:00:00'
shift_type:
type: string
examples:
- holiday
confirmation_deadline:
type: string
examples:
- '2026-08-11T11:32:34+00:00'
notes:
type:
- string
- 'null'
examples:
- null
location:
type: object
properties:
name:
type: string
examples:
- Mohr-Bernier
address:
type: string
examples:
- '57499 Okuneva Springs'
lat:
type: number
examples:
- 46.819652
lng:
type: number
examples:
- 9.690901
compensation:
type: object
properties:
hourly_rate_gross:
type: number
examples:
- 32.63
estimated_gross:
type: number
examples:
- 230.33
currency:
type: string
examples:
- EUR
supplements:
type: object
properties:
night:
type: integer
examples: [0]
weekend:
type: integer
examples: [0]
can_confirm:
type: boolean
examples:
- false
can_clock_in:
type: boolean
examples:
- false
contact_person_name:
type:
- string
- 'null'
examples:
- null
contact_person_phone:
type:
- string
- 'null'
examples:
- null
contact_person_avatar_url:
type:
- string
- 'null'
examples:
- null
meeting_point:
type:
- string
- 'null'
examples:
- null
dress_code:
type: string
examples:
- 'Vero amet fugiat quaerat odit.'
job:
type: object
properties:
id:
type: string
examples:
- 019fd4e7-8da0-718d-8b0a-7fa0f29523e2
title:
type: string
examples:
- 'Loan Interviewer'
category:
type: string
examples:
- retail
organization:
type: object
properties:
id:
type: string
examples:
- 019fd4e7-5633-700f-ad54-9f03c0661fd1
name:
type: string
examples:
- Caritas
logo_url:
type:
- string
- 'null'
examples:
- null
average_rating:
type:
- string
- 'null'
examples:
- null
contract:
type:
- string
- 'null'
examples:
- null
examples:
-
-
id: 019fd4e7-8db5-7390-a768-5cc04b8a5ecc
status: signed
status_label: Unterschrieben
shift_date: '2026-08-07'
scheduled_start_time: '08:00:00'
scheduled_end_time: '16:00:00'
shift_type: holiday
confirmation_deadline: '2026-08-11T11:32:34+00:00'
notes: null
location:
name: Mohr-Bernier
address: '57499 Okuneva Springs'
lat: 46.819652
lng: 9.690901
compensation:
hourly_rate_gross: 32.63
estimated_gross: 230.33
currency: EUR
supplements:
night: 0
weekend: 0
can_confirm: false
can_clock_in: false
contact_person_name: null
contact_person_phone: null
contact_person_avatar_url: null
meeting_point: null
dress_code: 'Vero amet fugiat quaerat odit.'
job:
id: 019fd4e7-8da0-718d-8b0a-7fa0f29523e2
title: 'Loan Interviewer'
category: retail
organization:
id: 019fd4e7-5633-700f-ad54-9f03c0661fd1
name: Caritas
logo_url: null
average_rating: null
contract: null
pagination:
type: object
properties:
current_page:
type: integer
examples:
- 1
last_page:
type: integer
examples:
- 1
per_page:
type: integer
examples:
- 15
total:
type: integer
examples:
- 1
examples:
-
status: SUCCESS
data:
shifts:
-
id: 019fd4e7-8db5-7390-a768-5cc04b8a5ecc
status: signed
status_label: Unterschrieben
shift_date: '2026-08-07'
scheduled_start_time: '08:00:00'
scheduled_end_time: '16:00:00'
shift_type: holiday
confirmation_deadline: '2026-08-11T11:32:34+00:00'
notes: null
location:
name: Mohr-Bernier
address: '57499 Okuneva Springs'
lat: 46.819652
lng: 9.690901
compensation:
hourly_rate_gross: 32.63
estimated_gross: 230.33
currency: EUR
supplements:
night: 0
weekend: 0
can_confirm: false
can_clock_in: false
contact_person_name: null
contact_person_phone: null
contact_person_avatar_url: null
meeting_point: null
dress_code: 'Vero amet fugiat quaerat odit.'
job:
id: 019fd4e7-8da0-718d-8b0a-7fa0f29523e2
title: 'Loan Interviewer'
category: retail
organization:
id: 019fd4e7-5633-700f-ad54-9f03c0661fd1
name: Caritas
logo_url: null
average_rating: null
contract: null
pagination:
current_page: 1
last_page: 1
per_page: 15
total: 1
tags:
- 'Mobile API'
/api/v1/mobile/shifts/calendar:
get:
summary: 'Get Shift Calendar'
operationId: getShiftCalendar
description: "Returns shifts organized for calendar display.\nSupports weekly view (default) and monthly view (±15 days or full month).\n\nWeekly view: Returns shifts grouped by date for current week or specified week.\nMonthly view: Returns dates with shifts marked + shift list for that month."
parameters:
-
in: query
name: view
description: 'Calendar view: weekly or monthly.'
required: false
schema:
type: string
description: 'Calendar view: weekly or monthly.'
examples:
- weekly
-
in: query
name: date
description: 'date Reference date. Defaults to today, which is what the app wants on open.'
example: null
required: false
schema:
type: string
description: 'date Reference date. Defaults to today, which is what the app wants on open.'
examples:
- null
-
in: query
name: month
description: 'Month for the monthly view (YYYY-MM). Defaults to the current month.'
example: null
required: false
schema:
type: string
description: 'Month for the monthly view (YYYY-MM). Defaults to the current month.'
examples:
- null
responses:
200:
description: Monthly
content:
text/plain:
schema:
type: string
examples:
- '{"status":"SUCCESS","data":{"view":"monthly","month":"2026-06","dates_with_shifts":["2026-06-18","2026-06-20","2026-06-25"],"calendar_weeks":[[...]],"shifts":[...]}}'
tags:
- 'Mobile API'
'/api/v1/mobile/shifts/{shiftId}/readiness':
get:
summary: 'Get Shift Readiness'
operationId: getShiftReadiness
description: "Returns whether the authenticated employee is ready to clock in for a\nspecific shift, plus a list of any blocking conditions.\n\nReadiness checks (in order):\n 1. Shift belongs to the authenticated employee\n 2. Shift status is `signed` (not yet clocked in)\n 3. Shift date is today (Austrian time)\n 4. Current time is within the clock-in window:\n 30 minutes before scheduled_start_time up to 30 minutes after end_time\n 5. No active attendance record already exists (prevents double clock-in)\n\nThe response always returns HTTP 200; `ready` indicates whether the\nemployee may proceed to clock in."
parameters: []
responses:
200:
description: ''
content:
application/json:
schema:
oneOf:
-
description: 'Not Ready'
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
ready:
type: boolean
examples:
- false
shift_id:
type: string
examples:
- 9c3f5f3d-0123-4abc-b456-426614174000
shift_date:
type: string
examples:
- '2026-06-28'
scheduled_start_time:
type: string
examples:
- '08:00'
scheduled_end_time:
type: string
examples:
- '16:00'
blockers:
type: array
items:
type: string
examples:
-
- not_today
- outside_clock_in_window
examples:
-
status: SUCCESS
data:
ready: false
shift_id: 9c3f5f3d-0123-4abc-b456-426614174000
shift_date: '2026-06-28'
scheduled_start_time: '08:00'
scheduled_end_time: '16:00'
blockers:
- not_today
- outside_clock_in_window
-
description: 'Recorded from a live call'
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
ready:
type: boolean
examples:
- false
shift_id:
type: string
examples:
- 019fd4e7-8dae-73bd-8647-588dbb86c1a6
shift_date:
type: string
examples:
- '2026-08-05'
scheduled_start_time:
type: string
examples:
- '19:33:00'
scheduled_end_time:
type: string
examples:
- '06:36:00'
blockers:
type: array
items:
type: string
examples:
-
- invalid_status
- contract_unsigned
- rahmenvertrag_unsigned
- ecard_missing
- not_today
- outside_clock_in_window
examples:
-
status: SUCCESS
data:
ready: false
shift_id: 019fd4e7-8dae-73bd-8647-588dbb86c1a6
shift_date: '2026-08-05'
scheduled_start_time: '19:33:00'
scheduled_end_time: '06:36:00'
blockers:
- invalid_status
- contract_unsigned
- rahmenvertrag_unsigned
- ecard_missing
- not_today
- outside_clock_in_window
403:
description: ''
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- ERROR
message:
type: string
examples:
- 'Diese Schicht gehört nicht zu deinem Konto.'
examples:
-
status: ERROR
message: 'Diese Schicht gehört nicht zu deinem Konto.'
404:
description: ''
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- ERROR
message:
type: string
examples:
- 'Schicht nicht gefunden.'
examples:
-
status: ERROR
message: 'Schicht nicht gefunden.'
tags:
- 'Mobile API'
parameters:
-
in: path
name: shiftId
description: 'UUID of the shift.'
required: true
schema:
type: string
examples:
- 9c3f5f3d-0123-4abc-b456-426614174000
'/api/v1/mobile/shifts/{shiftId}':
get:
summary: 'Get Shift'
operationId: getShift
description: "Everything the shift screen needs while a shift is running: the booking\nitself, where it is, who to ask for, and the clock.\n\nUntil now a shift could be listed and acted on but not fetched, so a\nscreen opened on one had to keep whatever the list gave it and could not\nrefresh after a clock-in or a break.\n\n`attendance.worked_seconds` is time on the clock with breaks already\ndeducted — the client counts on from it rather than polling. While a\nbreak is open, `current_break_seconds` does the same for the break, and\n`worked_seconds` stops advancing.\n\n`actions` says which of the controls apply right now, decided by the\nsame rules the clock-in, clock-out and break endpoints enforce, so the\nscreen does not have to reimplement them and then disagree.\n\n`contract` is the Überlassungsvertrag for **this shift alone**. Each\nshift is agreed to separately, because a company can set terms on a\nsingle shift, so a worker taking three days signs three contracts and\neach has its own `sign_deadline`. Its `id` is what\n`GET /mobile/contracts/{contractId}` and `POST .../sign` take, so the\nscreen can open or sign the right one without searching the worker's\ncontract list. It is null before the company has selected the worker."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
shift:
type: object
properties:
id:
type: string
examples:
- 019fd4e7-8dae-73bd-8647-588dbb86c1a6
status:
type: string
examples:
- awaiting_signature
status_label:
type: string
examples:
- 'Unterschrift ausstehend'
shift_date:
type: string
examples:
- '2026-08-05'
scheduled_start_time:
type: string
examples:
- '19:33:00'
scheduled_end_time:
type: string
examples:
- '06:36:00'
shift_type:
type: string
examples:
- day
confirmation_deadline:
type: string
examples:
- '2026-08-23T19:02:29+00:00'
notes:
type:
- string
- 'null'
examples:
- null
location:
type: object
properties:
name:
type: string
examples:
- 'Marvin and Sons'
address:
type: string
examples:
- '886 Schimmel Plaza Suite 357'
lat:
type: number
examples:
- 48.035945
lng:
type: number
examples:
- 14.889039
compensation:
type: object
properties:
hourly_rate_gross:
type: number
examples:
- 16.24
estimated_gross:
type: number
examples:
- 132.68
currency:
type: string
examples:
- EUR
supplements:
type: object
properties:
night:
type: integer
examples:
- 0
weekend:
type: integer
examples:
- 0
can_confirm:
type: boolean
examples:
- true
can_clock_in:
type: boolean
examples:
- false
contact_person_name:
type:
- string
- 'null'
examples:
- null
contact_person_phone:
type:
- string
- 'null'
examples:
- null
contact_person_avatar_url:
type:
- string
- 'null'
examples:
- null
meeting_point:
type:
- string
- 'null'
examples:
- null
dress_code:
type: string
examples:
- 'Vero amet fugiat quaerat odit.'
job:
type: object
properties:
id:
type: string
examples:
- 019fd4e7-8da0-718d-8b0a-7fa0f29523e2
title:
type: string
examples:
- 'Loan Interviewer'
category:
type: string
examples:
- retail
organization:
type: object
properties:
id:
type: string
examples:
- 019fd4e7-5633-700f-ad54-9f03c0661fd1
name:
type: string
examples:
- Caritas
logo_url:
type:
- string
- 'null'
examples:
- null
average_rating:
type:
- string
- 'null'
examples:
- null
contract:
type: object
properties:
id:
type: string
examples:
- 019fd4e7-8db1-7290-97a1-e17bfbb64a4d
contract_number:
type: string
examples:
- UEVG-556708
status:
type: string
examples:
- pending_signature
status_label:
type: string
examples:
- 'Unterschrift ausstehend'
is_signed:
type: boolean
examples:
- false
can_sign:
type: boolean
examples:
- true
signed_at:
type:
- string
- 'null'
examples:
- null
sign_deadline:
type: string
examples:
- '2026-08-07T02:29:32+00:00'
is_overdue:
type: boolean
examples:
- false
planned_break_minutes:
type: integer
examples:
- 0
paid_break_minutes:
type: integer
examples:
- 30
attendance:
type: object
properties:
clock_in_at:
type:
- string
- 'null'
examples:
- null
clock_out_at:
type:
- string
- 'null'
examples:
- null
worked_seconds:
type: integer
examples:
- 0
break_minutes_taken:
type: integer
examples:
- 0
is_on_break:
type: boolean
examples:
- false
current_break_started_at:
type:
- string
- 'null'
examples:
- null
current_break_seconds:
type: integer
examples:
- 0
actions:
type: object
properties:
can_clock_in:
type: boolean
examples:
- false
can_clock_out:
type: boolean
examples:
- false
can_start_break:
type: boolean
examples:
- false
can_end_break:
type: boolean
examples:
- false
can_report_incident:
type: boolean
examples:
- false
can_change_workplace:
type: boolean
examples:
- false
can_sign_contract:
type: boolean
examples:
- true
examples:
-
status: SUCCESS
data:
shift:
id: 019fd4e7-8dae-73bd-8647-588dbb86c1a6
status: awaiting_signature
status_label: 'Unterschrift ausstehend'
shift_date: '2026-08-05'
scheduled_start_time: '19:33:00'
scheduled_end_time: '06:36:00'
shift_type: day
confirmation_deadline: '2026-08-23T19:02:29+00:00'
notes: null
location:
name: 'Marvin and Sons'
address: '886 Schimmel Plaza Suite 357'
lat: 48.035945
lng: 14.889039
compensation:
hourly_rate_gross: 16.24
estimated_gross: 132.68
currency: EUR
supplements:
night: 0
weekend: 0
can_confirm: true
can_clock_in: false
contact_person_name: null
contact_person_phone: null
contact_person_avatar_url: null
meeting_point: null
dress_code: 'Vero amet fugiat quaerat odit.'
job:
id: 019fd4e7-8da0-718d-8b0a-7fa0f29523e2
title: 'Loan Interviewer'
category: retail
organization:
id: 019fd4e7-5633-700f-ad54-9f03c0661fd1
name: Caritas
logo_url: null
average_rating: null
contract:
id: 019fd4e7-8db1-7290-97a1-e17bfbb64a4d
contract_number: UEVG-556708
status: pending_signature
status_label: 'Unterschrift ausstehend'
is_signed: false
can_sign: true
signed_at: null
sign_deadline: '2026-08-07T02:29:32+00:00'
is_overdue: false
planned_break_minutes: 0
paid_break_minutes: 30
attendance:
clock_in_at: null
clock_out_at: null
worked_seconds: 0
break_minutes_taken: 0
is_on_break: false
current_break_started_at: null
current_break_seconds: 0
actions:
can_clock_in: false
can_clock_out: false
can_start_break: false
can_end_break: false
can_report_incident: false
can_change_workplace: false
can_sign_contract: true
404:
description: "Not the caller's shift"
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- RESOURCE_NOT_FOUND
message:
type: string
examples:
- 'Die Schicht wurde nicht gefunden.'
examples:
-
status: RESOURCE_NOT_FOUND
message: 'Die Schicht wurde nicht gefunden.'
tags:
- 'Mobile API'
parameters:
-
in: path
name: shiftId
description: 'The assignment to read.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
'/api/v1/mobile/shifts/{shiftId}/incident':
post:
summary: 'Report Shift Incident'
operationId: reportShiftIncident
description: "Allows an employee to report a workplace incident that occurred during\nan active or recently completed shift (injury, safety concern, equipment\nfailure, etc.). Creates a support ticket of category `shift` linked to\nthe given shift.\n\nThe incident report is sent to the internal team for follow-up.\nAustrian ASchG §15 obliges employers/employees to report workplace injuries."
parameters: []
responses:
201:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
ticket_id:
type: string
examples:
- 019fd2b8-3a07-70e6-be52-a12bdc110c54
ticket_number:
type: string
examples:
- TKT-202608-00001
message:
type: string
examples:
- 'Vorfall wurde gemeldet.'
examples:
-
status: SUCCESS
data:
ticket_id: 019fd2b8-3a07-70e6-be52-a12bdc110c54
ticket_number: TKT-202608-00001
message: 'Vorfall wurde gemeldet.'
403:
description: ''
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- ERROR
message:
type: string
examples:
- 'Diese Schicht gehört nicht zu deinem Konto.'
examples:
-
status: ERROR
message: 'Diese Schicht gehört nicht zu deinem Konto.'
404:
description: ''
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- ERROR
message:
type: string
examples:
- 'Schicht nicht gefunden.'
examples:
-
status: ERROR
message: 'Schicht nicht gefunden.'
422:
description: ''
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- ERROR
message:
type: string
examples:
- 'The description field is required.'
examples:
-
status: ERROR
message: 'The description field is required.'
tags:
- 'Mobile API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
incident_type:
type: string
description: 'Type of incident: Allowed: injury, safety, equipment, other.'
examples:
- injury
description:
type: string
description: 'Description of the incident (20–5000 chars).'
examples:
- 'I slipped on a wet floor near the loading bay.'
occurred_at:
type: string
description: 'nullable Timestamp when the incident occurred (ISO 8601).'
examples:
- '2026-06-27T14:30:00Z'
lat:
type: number
description: "nullable Where the worker was when filing the report. Falls back to the assignment's last location ping when omitted."
examples:
- 48.2082
lng:
type: number
description: nullable
examples:
- 16.3738
required:
- incident_type
- description
parameters:
-
in: path
name: shiftId
description: 'UUID of the shift.'
required: true
schema:
type: string
examples:
- 9c3f5f3d-0123-4abc-b456-426614174000
'/api/v1/mobile/shifts/{shiftId}/hours-confirmation':
get:
summary: 'Confirm My Hours'
operationId: confirmMyHours
description: ''
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
clock_in_at:
type: string
examples:
- '2026-08-06T02:30:01+00:00'
clock_out_at:
type: string
examples:
- '2026-08-06T10:30:01+00:00'
break_minutes:
type: integer
examples:
- 480
scheduled_end_time:
type: string
examples:
- '10:30:00'
payable_minutes:
type: integer
examples:
- 30
unclaimed_overtime_minutes:
type: integer
examples:
- 0
confirmed_at:
type:
- string
- 'null'
examples:
- null
examples:
-
status: SUCCESS
data:
clock_in_at: '2026-08-06T02:30:01+00:00'
clock_out_at: '2026-08-06T10:30:01+00:00'
break_minutes: 480
scheduled_end_time: '10:30:00'
payable_minutes: 30
unclaimed_overtime_minutes: 0
confirmed_at: null
tags:
- 'Mobile API'
post:
summary: 'Confirm My Hours'
operationId: confirmMyHours
description: "The worker's sign-off on what they will be paid for, after clocking out.\n\nA GET returns the figures the screen shows: when they actually clocked in\nand out, how many of those minutes are payable, and how many fall outside\nthe cap and would need an overtime request. The POST records their\nagreement, with an optional signature.\n\nConfirming does not settle anything — the company still confirms the hours\nin its own Hours screen, and that is what reaches payroll. This records the\nworker's side of the story so a later disagreement has both."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Your hours have been confirmed.'
data:
type: object
properties:
clock_in_at:
type: string
examples:
- '2026-08-05T16:19:02+00:00'
clock_out_at:
type: string
examples:
- '2026-08-06T00:19:02+00:00'
break_minutes:
type: integer
examples:
- 480
scheduled_end_time:
type: string
examples:
- '00:19:00'
payable_minutes:
type: integer
examples:
- 30
unclaimed_overtime_minutes:
type: integer
examples:
- 0
confirmed_at:
type: string
examples:
- '2026-08-06T00:19:02+00:00'
examples:
-
status: SUCCESS
message: 'Your hours have been confirmed.'
data:
clock_in_at: '2026-08-05T16:19:02+00:00'
clock_out_at: '2026-08-06T00:19:02+00:00'
break_minutes: 480
scheduled_end_time: '00:19:00'
payable_minutes: 30
unclaimed_overtime_minutes: 0
confirmed_at: '2026-08-06T00:19:02+00:00'
422:
description: 'Not clocked out'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- INVALID_OPERATION
message:
type: string
examples:
- 'You have not clocked out of this shift yet.'
examples:
-
status: INVALID_OPERATION
message: 'You have not clocked out of this shift yet.'
tags:
- 'Mobile API'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
signature:
type:
- string
- 'null'
description: 'Base64 signature drawn on the confirmation screen.'
examples:
- null
parameters:
-
in: path
name: shiftId
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
/api/v1/mobile/requests:
get:
summary: 'List My Shift Requests'
operationId: listMyShiftRequests
description: "Every request the authenticated worker has raised, newest first, optionally\nnarrowed to one shift or one status."
parameters:
-
in: query
name: shift_id
description: 'Only requests against this assignment.'
required: false
schema:
type: string
description: 'Only requests against this assignment.'
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
-
in: query
name: status
description: 'Allowed: pending, approved, declined, withdrawn.'
required: false
schema:
type: string
description: 'Allowed: pending, approved, declined, withdrawn.'
examples:
- pending
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
requests:
type: array
items:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-a28b-7060-8491-a3fa2aee9676
assignment_id:
type: string
examples:
- 019fd2b8-a219-710c-9a2a-91af501576cd
type:
type: string
examples:
- overtime
type_label:
type: string
examples:
- Überstunden
affects_pay:
type: boolean
examples:
- true
status:
type: string
examples:
- pending
status_label:
type: string
examples:
- Offen
reason_code:
type:
- string
- 'null'
examples:
- null
reason_note:
type: string
examples:
- 'Die Lieferung musste noch fertig verräumt werden.'
claimed_minutes:
type: integer
examples:
- 45
evidence:
type: array
examples:
- []
requested_at:
type: string
examples:
- '2026-08-06T00:19:03+00:00'
decision:
type:
- string
- 'null'
examples:
- null
escalated_at:
type:
- string
- 'null'
examples:
- null
conversation_id:
type:
- string
- 'null'
examples:
- null
examples:
-
-
id: 019fd2b8-a28b-7060-8491-a3fa2aee9676
assignment_id: 019fd2b8-a219-710c-9a2a-91af501576cd
type: overtime
type_label: Überstunden
affects_pay: true
status: pending
status_label: Offen
reason_code: null
reason_note: 'Die Lieferung musste noch fertig verräumt werden.'
claimed_minutes: 45
evidence: []
requested_at: '2026-08-06T00:19:03+00:00'
decision: null
escalated_at: null
conversation_id: null
-
id: 019fd2b8-a252-73da-94fd-15b16c76b745
assignment_id: 019fd2b8-a219-710c-9a2a-91af501576cd
type: manual_check_in
type_label: 'Manuelle Anmeldung'
affects_pay: false
status: pending
status_label: Offen
reason_code: no_qr_scan
reason_note: null
claimed_minutes: null
evidence: []
requested_at: '2026-08-05T16:19:03+00:00'
decision: null
escalated_at: null
conversation_id: null
examples:
-
status: SUCCESS
data:
requests:
-
id: 019fd2b8-a28b-7060-8491-a3fa2aee9676
assignment_id: 019fd2b8-a219-710c-9a2a-91af501576cd
type: overtime
type_label: Überstunden
affects_pay: true
status: pending
status_label: Offen
reason_code: null
reason_note: 'Die Lieferung musste noch fertig verräumt werden.'
claimed_minutes: 45
evidence: []
requested_at: '2026-08-06T00:19:03+00:00'
decision: null
escalated_at: null
conversation_id: null
-
id: 019fd2b8-a252-73da-94fd-15b16c76b745
assignment_id: 019fd2b8-a219-710c-9a2a-91af501576cd
type: manual_check_in
type_label: 'Manuelle Anmeldung'
affects_pay: false
status: pending
status_label: Offen
reason_code: no_qr_scan
reason_note: null
claimed_minutes: null
evidence: []
requested_at: '2026-08-05T16:19:03+00:00'
decision: null
escalated_at: null
conversation_id: null
tags:
- 'Mobile API'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
shift_id:
type:
- string
- 'null'
description: 'Must be a valid UUID.'
examples:
- 6ff8f7f6-1eb3-3525-be4a-3932c805afed
status:
type:
- string
- 'null'
description: ''
enum:
- pending
- approved
- declined
- withdrawn
examples:
- withdrawn
'/api/v1/mobile/shifts/{shiftId}/requests':
post:
summary: 'Raise a Shift Request'
operationId: raiseAShiftRequest
description: "Asks the company to decide something about a shift the worker was assigned\nto — extra time worked, an early departure, a correction to the recorded\nhours, or evidence excusing an absence.\n\nNothing here blocks the worker: an overtime request is raised *after* they\nhave already clocked out, and the recorded clock-out time is never altered\nby it. What the request can change is how many of those minutes are paid."
parameters: []
responses:
201:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Your request has been sent to the company.'
data:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-a28b-7060-8491-a3fa2aee9676
assignment_id:
type: string
examples:
- 019fd2b8-a219-710c-9a2a-91af501576cd
type:
type: string
examples:
- overtime
type_label:
type: string
examples:
- Überstunden
affects_pay:
type: boolean
examples:
- true
status:
type: string
examples:
- pending
status_label:
type: string
examples:
- Offen
reason_code:
type:
- string
- 'null'
examples:
- null
reason_note:
type: string
examples:
- 'Die Lieferung musste noch fertig verräumt werden.'
claimed_minutes:
type: integer
examples:
- 45
evidence:
type: array
examples:
- []
requested_at:
type: string
examples:
- '2026-08-06T00:19:03+00:00'
decision:
type:
- string
- 'null'
examples:
- null
escalated_at:
type:
- string
- 'null'
examples:
- null
conversation_id:
type:
- string
- 'null'
examples:
- null
examples:
-
status: SUCCESS
message: 'Your request has been sent to the company.'
data:
id: 019fd2b8-a28b-7060-8491-a3fa2aee9676
assignment_id: 019fd2b8-a219-710c-9a2a-91af501576cd
type: overtime
type_label: Überstunden
affects_pay: true
status: pending
status_label: Offen
reason_code: null
reason_note: 'Die Lieferung musste noch fertig verräumt werden.'
claimed_minutes: 45
evidence: []
requested_at: '2026-08-06T00:19:03+00:00'
decision: null
escalated_at: null
conversation_id: null
422:
description: 'Already open'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- VALIDATION_ERROR
message:
type: string
examples:
- 'A request of this type is already open for this shift.'
examples:
-
status: VALIDATION_ERROR
message: 'A request of this type is already open for this shift.'
tags:
- 'Mobile API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
type:
type: string
description: 'Allowed: overtime, early_end, hours_correction, manual_check_in, absence_excuse, workplace_change.'
examples:
- overtime
reason_code:
type:
- string
- 'null'
description: 'A machine-readable reason the app can translate.'
examples:
- covered_for_colleague
reason_note:
type:
- string
- 'null'
description: "The worker's own description."
examples:
- 'Stayed to finish the late delivery.'
claimed_minutes:
type:
- integer
- 'null'
description: 'Extra minutes claimed (overtime and hours corrections).'
examples:
- 45
evidence:
type: array
description: 'Ids of shift attachments backing the claim.'
items:
type: string
examples:
-
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
required:
- type
parameters:
-
in: path
name: shiftId
description: 'The assignment the request concerns.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
'/api/v1/mobile/requests/{requestId}':
delete:
summary: 'Withdraw a Shift Request'
operationId: withdrawAShiftRequest
description: "Takes back a request the company has not decided yet. Once decided it\nstands — the record of what was asked and what was answered is part of the\npay trail and is not erasable by either side."
parameters: []
responses:
409:
description: 'Already decided'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- INVALID_OPERATION
message:
type: string
examples:
- 'This request has already been decided.'
examples:
-
status: INVALID_OPERATION
message: 'This request has already been decided.'
tags:
- 'Mobile API'
parameters:
-
in: path
name: requestId
description: 'The request to withdraw.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
'/api/v1/mobile/shifts/{shiftId}/workplace-change':
post:
summary: 'Record Workplace Change'
operationId: recordWorkplaceChange
description: "Records a mid-shift workplace change discovered by the employee\n(different employer, different location, or different working conditions\nthan those agreed in the Überlassungsbestätigung).\n\nPer BUAG §3 and AÜG §11, employees must be informed about and consent to\nworkplace changes. This action stores the change event in the `workplace_changes`\nJSONB column added by migration M1.\n\nThe employee must be actively clocked in for this endpoint to accept changes."
parameters: []
responses:
200:
description: ''
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
message:
type: string
examples:
- 'Arbeitsortänderung wurde erfasst.'
total_changes:
type: integer
examples:
- 1
examples:
-
status: SUCCESS
data:
message: 'Arbeitsortänderung wurde erfasst.'
total_changes: 1
400:
description: ''
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- ERROR
message:
type: string
examples:
- 'Du bist nicht eingestempelt.'
examples:
-
status: ERROR
message: 'Du bist nicht eingestempelt.'
403:
description: ''
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- ERROR
message:
type: string
examples:
- 'Diese Schicht gehört nicht zu deinem Konto.'
examples:
-
status: ERROR
message: 'Diese Schicht gehört nicht zu deinem Konto.'
404:
description: ''
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- ERROR
message:
type: string
examples:
- 'Schicht nicht gefunden.'
examples:
-
status: ERROR
message: 'Schicht nicht gefunden.'
tags:
- 'Mobile API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
change_type:
type: string
description: 'Type of change: Allowed: employer, location, conditions, other.'
examples:
- location
old_value:
type: string
description: 'Previous value (e.g. old address).'
examples:
- 'Hauptstraße 1, 1010 Wien'
new_value:
type: string
description: 'New value after change.'
examples:
- 'Mariahilfer Str. 50, 1060 Wien'
reason:
type: string
description: 'nullable Free-text reason for the change.'
examples:
- 'Production line moved.'
consent_given:
type: boolean
description: 'Employee confirms they were informed and consent.'
examples:
- true
required:
- change_type
- old_value
- new_value
- consent_given
parameters:
-
in: path
name: shiftId
description: 'UUID of the shift.'
required: true
schema:
type: string
examples:
- 9c3f5f3d-0123-4abc-b456-426614174000
'/api/v1/mobile/shifts/{shiftId}/cancel':
post:
summary: 'Cancel Shift'
operationId: cancelShift
description: "The worker cancels their own shift. What that costs depends on whether\nthey had signed:\n\n**Unsigned (`awaiting_signature`) — declining.** The worker is refusing\nto sign, not breaking a commitment, so it is free at any time: no 24-hour\nwindow, no Stornopauschale, no reliability entry. Letting the sign\ndeadline lapse costs nothing, and saying no outright cannot cost more.\n\n**Signed — cancelling.** Within 24 hours of start it is refused\n(`DEADLINE_PASSED` — contact support); 24–48 hours' notice carries the\nStornopauschale and a reliability penalty; more than 48 hours is\npenalty-free.\n\nEither way the shift's own Überlassungsvertrag is revoked with it, so\nnothing signable (or in force) survives on a cancelled shift."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'The shift has been cancelled. Your reliability score may be affected.'
data:
type: object
properties:
shift_id:
type: string
examples:
- 019fd359-b78c-730d-810e-166b221166a5
cancelled_at:
type: string
examples:
- '2026-08-05 19:15'
notice_hours:
type: integer
examples:
- 0
reliability_impact:
type: integer
examples:
- 0
examples:
-
status: SUCCESS
message: 'The shift has been cancelled. Your reliability score may be affected.'
data:
shift_id: 019fd359-b78c-730d-810e-166b221166a5
cancelled_at: '2026-08-05 19:15'
notice_hours: 0
reliability_impact: 0
422:
description: ''
content:
application/json:
schema:
oneOf:
-
description: 'Signed, under 24 hours to start'
type: object
properties:
status:
type: string
examples:
- DEADLINE_PASSED
message:
type: string
examples:
- 'Diese Schicht kann weniger als 24 Stunden vor Beginn nicht mehr selbst storniert werden. Bitte kontaktieren Sie den Support.'
examples:
-
status: DEADLINE_PASSED
message: 'Diese Schicht kann weniger als 24 Stunden vor Beginn nicht mehr selbst storniert werden. Bitte kontaktieren Sie den Support.'
-
description: 'Already cancelled or completed'
type: object
properties:
status:
type: string
examples:
- INVALID_OPERATION
message:
type: string
examples:
- 'Diese Schicht kann nicht storniert werden.'
examples:
-
status: INVALID_OPERATION
message: 'Diese Schicht kann nicht storniert werden.'
tags:
- 'Mobile API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
reason:
type: string
description: 'Why the worker is dropping the shift. 10–500 characters.'
examples:
- 'Krankheitsbedingt kurzfristig abgesagt.'
required:
- reason
parameters:
-
in: path
name: shiftId
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
'/api/v1/mobile/shifts/{shiftId}/clock-in':
post:
summary: 'Clock In'
operationId: clockIn
description: 'Clock in to a shift.'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'You have successfully clocked in.'
data:
type: object
properties:
attendance:
type: object
properties:
id:
type: string
examples:
- 019fd515-53b8-73b9-8f04-c3758917dbf3
clock_in_at:
type: string
examples:
- '2026-08-06T03:19:32+00:00'
clock_in_method:
type: string
examples:
- manual
shift:
type: object
properties:
id:
type: string
examples:
- 019fd515-5399-73cd-ba1c-6d51fdd33ee7
status:
type: string
examples:
- checked_in
conversation_id:
type: string
examples:
- 019fd515-53c3-70a6-93d3-1451aec0adfa
gps_fallback:
type: boolean
examples:
- false
support_notified:
type: boolean
examples:
- false
examples:
-
status: SUCCESS
message: 'You have successfully clocked in.'
data:
attendance:
id: 019fd515-53b8-73b9-8f04-c3758917dbf3
clock_in_at: '2026-08-06T03:19:32+00:00'
clock_in_method: manual
shift:
id: 019fd515-5399-73cd-ba1c-6d51fdd33ee7
status: checked_in
conversation_id: 019fd515-53c3-70a6-93d3-1451aec0adfa
gps_fallback: false
support_notified: false
tags:
- 'Mobile API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
lat:
type: number
description: 'Required for manual/gps check-ins (unless gps_unavailable).'
examples:
- 48.2082
lng:
type: number
description: 'Required for manual/gps check-ins (unless gps_unavailable).'
examples:
- 16.3738
method:
type:
- string
- 'null'
description: 'Allowed: qr, gps, manual, nfc.'
examples:
- manual
signature:
type:
- string
- 'null'
description: ''
examples:
- Beispieltext
photos:
type: array
description: 'Photo proof, 1–4 images (JPEG/PNG/WebP), required for manual/gps check-ins — sent as multipart.'
items:
type: string
format: binary
gps_unavailable:
type: boolean
description: 'GPS unavailable on the device — support is notified; photos stay required.'
examples:
- false
required:
- photos
parameters:
-
in: path
name: shiftId
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- "019f9939-c4c3-70fb-a54e-5ebf63db36d2\n\nA QR scan proves presence by itself. A **manual or GPS check-in** must\nbring its own proof: `lat`/`lng` are required and checked against the\nworkplace — beyond the configured radius (500 m) the check-in is\nrefused with `LOCATION_OUT_OF_RANGE` — and at least one photo taken on\nsite must accompany the request. The photos are stored as shift\nattachments and put in front of the company together with the\ncheck-in review.\n\nWith `gps_unavailable: true` the position requirement is waived, the\ncheck-in is flagged for support, and the photos remain mandatory."
'/api/v1/mobile/shifts/{shiftId}/clock-out':
post:
summary: 'Clock Out'
operationId: clockOut
description: 'Clock out from a shift.'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'You have successfully clocked out.'
data:
type: object
properties:
attendance:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-9e87-7131-9457-cc5bea1d6e78
clock_in_at:
type: string
examples:
- '2026-08-05T16:19:02+00:00'
clock_out_at:
type: string
examples:
- '2026-08-06T00:19:02+00:00'
total_hours_worked:
type: integer
examples:
- 8
break_minutes:
type: integer
examples:
- 480
overtime_hours:
type: integer
examples:
- 0
actual_gross_amount:
type: integer
examples:
- 0
shift:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-9e68-73ba-aff1-e1ff0de2c556
status:
type: string
examples:
- completed
examples:
-
status: SUCCESS
message: 'You have successfully clocked out.'
data:
attendance:
id: 019fd2b8-9e87-7131-9457-cc5bea1d6e78
clock_in_at: '2026-08-05T16:19:02+00:00'
clock_out_at: '2026-08-06T00:19:02+00:00'
total_hours_worked: 8
break_minutes: 480
overtime_hours: 0
actual_gross_amount: 0
shift:
id: 019fd2b8-9e68-73ba-aff1-e1ff0de2c556
status: completed
tags:
- 'Mobile API'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
lat:
type:
- integer
- 'null'
description: ''
examples:
- 1
lng:
type:
- integer
- 'null'
description: ''
examples:
- 1
method:
type:
- string
- 'null'
description: 'Allowed: qr, gps, manual, nfc.'
examples:
- qr
break_minutes:
type:
- integer
- 'null'
description: ''
examples:
- 1
signature:
type:
- string
- 'null'
description: ''
examples:
- Beispieltext
early_checkout_reason:
type:
- string
- 'null'
description: ''
examples:
- 'Krankheitsbedingt kurzfristig abgesagt.'
early_checkout_category:
type:
- string
- 'null'
description: 'Allowed: sickness, injury, misconduct, left_workplace, employer_ended, other.'
examples:
- sickness
parameters:
-
in: path
name: shiftId
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
'/api/v1/mobile/shifts/{shiftId}/break':
post:
summary: 'Toggle Break'
operationId: toggleBreak
description: 'Employee starts or ends a break with a simple button tap.'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
action:
type: string
examples:
- break_started
break_id:
type: string
examples:
- 019fd2b8-9e9d-724c-8182-9d92c82b5d24
started_at:
type: string
examples:
- '2026-08-05T16:19:02+00:00'
break_type:
type: string
examples:
- standard
message:
type: string
examples:
- 'Pause gestartet'
meta:
type: object
properties:
is_on_break:
type: boolean
examples:
- true
total_break_minutes:
type: integer
examples:
- 0
mandatory_break_taken:
type: boolean
examples:
- false
examples:
-
status: SUCCESS
data:
action: break_started
break_id: 019fd2b8-9e9d-724c-8182-9d92c82b5d24
started_at: '2026-08-05T16:19:02+00:00'
break_type: standard
message: 'Pause gestartet'
meta:
is_on_break: true
total_break_minutes: 0
mandatory_break_taken: false
tags:
- 'Mobile API'
parameters:
-
in: path
name: shiftId
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
'/api/v1/mobile/shifts/{shiftId}/attachments':
post:
summary: 'Upload a photo / document attached to a shift (evidence, handover, …).'
operationId: uploadAPhotoDocumentAttachedToAShiftevidenceHandover
description: ''
parameters: []
responses:
201:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'The attachment has been uploaded.'
data:
type: object
properties:
attachment:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-3a7e-7235-9631-d728b029f2ea
original_filename:
type: string
examples:
- beispiel.pdf
mime_type:
type: string
examples:
- application/pdf
file_size:
type: integer
examples:
- 65536
caption:
type: string
examples:
- Übergabeprotokoll
created_at:
type: string
examples:
- '2026-08-05T16:18:36+00:00'
examples:
-
status: SUCCESS
message: 'The attachment has been uploaded.'
data:
attachment:
id: 019fd2b8-3a7e-7235-9631-d728b029f2ea
original_filename: beispiel.pdf
mime_type: application/pdf
file_size: 65536
caption: Übergabeprotokoll
created_at: '2026-08-05T16:18:36+00:00'
tags:
- 'Mobile API'
requestBody:
required: true
content:
multipart/form-data:
schema:
type: object
properties:
file:
type: string
format: binary
description: 'The photo or document.'
caption:
type: string
description: 'Optional short description.'
examples:
- Übergabeprotokoll
required:
- file
parameters:
-
in: path
name: shiftId
description: ''
required: true
schema:
type: string
examples:
- architecto
'/api/v1/mobile/shifts/{shiftId}/qr':
post:
summary: 'Generate Check In Qr'
operationId: generateCheckInQr
description: 'Generate a QR code payload for shift check-in/check-out.'
parameters:
-
in: query
name: action
description: 'The action type: clock_in, clock_out, break_start, break_end Allowed: clock_in, clock_out, break_start, break_end.'
required: true
schema:
type: string
description: 'The action type: clock_in, clock_out, break_start, break_end Allowed: clock_in, clock_out, break_start, break_end.'
examples:
- architecto
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- messages.qr_generated
data:
type: object
properties:
qr_payload:
type: string
examples:
- eyJpdiI6IkxPQXdSYmJ4akVDZGRldzhseWNTVnc9PSIsInZhbHVlIjoiaWNZc1FaMzk4QWRHN0RFR0M5WkNKU2NKcTNzN2tRSVZtSUJOcEdSLzR1TnAwUUxTamY0V0pWWWc2ZkNhQUYzak9NZzlnb0tVc1E0bXhIN1BXa2ZwZUR1SzlTTjZvUlpNSENUcWdZcGFUZFJsdVZZZldnOTFNNmRPa3JWYkJoUzZiTzFJR3Z2dFVDMlMyVnNENFpMMXViU2w2VGtYdWx1TnljWGZZQUlLZEo1UytvOHZ0OTVUZndJa0FvZnMrV28wIiwibWFjIjoiNTc4ZjhlZWQ1MTdhYTNhOTMzOGQ3MDAzMDU4YmYyMDNjNjgwYWMxNTZhZWE5YmI4MjYwOTc5MjljNzkxYTUxNiIsInRhZyI6IiJ9
expires_at:
type: string
examples:
- '2026-08-05T16:19:36+00:00'
action:
type: string
examples:
- clock_in
action_label:
type: string
examples:
- Einchecken
examples:
-
status: SUCCESS
message: messages.qr_generated
data:
qr_payload: eyJpdiI6IkxPQXdSYmJ4akVDZGRldzhseWNTVnc9PSIsInZhbHVlIjoiaWNZc1FaMzk4QWRHN0RFR0M5WkNKU2NKcTNzN2tRSVZtSUJOcEdSLzR1TnAwUUxTamY0V0pWWWc2ZkNhQUYzak9NZzlnb0tVc1E0bXhIN1BXa2ZwZUR1SzlTTjZvUlpNSENUcWdZcGFUZFJsdVZZZldnOTFNNmRPa3JWYkJoUzZiTzFJR3Z2dFVDMlMyVnNENFpMMXViU2w2VGtYdWx1TnljWGZZQUlLZEo1UytvOHZ0OTVUZndJa0FvZnMrV28wIiwibWFjIjoiNTc4ZjhlZWQ1MTdhYTNhOTMzOGQ3MDAzMDU4YmYyMDNjNjgwYWMxNTZhZWE5YmI4MjYwOTc5MjljNzkxYTUxNiIsInRhZyI6IiJ9
expires_at: '2026-08-05T16:19:36+00:00'
action: clock_in
action_label: Einchecken
tags:
- 'Mobile API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
action:
type: string
description: 'Allowed: clock_in, clock_out, break_start, break_end.'
examples:
- clock_in
required:
- action
parameters:
-
in: path
name: shiftId
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
'/api/v1/mobile/shifts/{shiftId}/dienstzettel':
get:
summary: 'Get Dienstzettel'
operationId: getDienstzettel
description: 'Stream the per-shift Dienstzettel as a PDF.'
parameters: []
responses:
503:
description: ''
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- ERROR
message:
type: string
examples:
- 'Service Unavailable'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type:
- string
- 'null'
examples:
- null
message:
type: string
examples:
- 'Service Unavailable'
examples:
-
-
field: null
message: 'Service Unavailable'
meta:
type: object
properties:
request_id:
type: string
examples:
- 43ecbfa4-7afc-4a80-8897-2927ce9ef626
timestamp:
type: string
examples:
- '2026-08-21T05:14:34.017781Z'
examples:
-
status: ERROR
message: 'Service Unavailable'
data: null
errors:
-
field: null
message: 'Service Unavailable'
meta:
request_id: 43ecbfa4-7afc-4a80-8897-2927ce9ef626
timestamp: '2026-08-21T05:14:34.017781Z'
tags:
- 'Mobile API'
parameters:
-
in: path
name: shiftId
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
'/api/v1/mobile/shifts/{shiftId}/earnings-statement':
get:
summary: 'Get Earnings Statement'
operationId: getEarningsStatement
description: 'Stream our own per-shift earnings statement (Verdienstabrechnung) as a PDF.'
parameters: []
responses:
503:
description: ''
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- ERROR
message:
type: string
examples:
- 'Service Unavailable'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type:
- string
- 'null'
examples:
- null
message:
type: string
examples:
- 'Service Unavailable'
examples:
-
-
field: null
message: 'Service Unavailable'
meta:
type: object
properties:
request_id:
type: string
examples:
- 7cd5c56f-d7e8-4b71-9899-3087a486211c
timestamp:
type: string
examples:
- '2026-08-21T05:14:34.030330Z'
examples:
-
status: ERROR
message: 'Service Unavailable'
data: null
errors:
-
field: null
message: 'Service Unavailable'
meta:
request_id: 7cd5c56f-d7e8-4b71-9899-3087a486211c
timestamp: '2026-08-21T05:14:34.030330Z'
tags:
- 'Mobile API'
parameters:
-
in: path
name: shiftId
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
'/api/v1/mobile/shifts/{shiftId}/rate':
post:
summary: 'Rate Company'
operationId: rateCompany
description: 'Employee submits a rating for a company after shift completion.'
parameters: []
responses:
201:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Your rating has been submitted successfully.'
data:
type: object
properties:
rating:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-3ad6-716f-9be2-5f73c4f494f2
overall_score:
type: integer
examples:
- 1
created_at:
type: string
examples:
- '2026-08-05 16:18'
examples:
-
status: SUCCESS
message: 'Your rating has been submitted successfully.'
data:
rating:
id: 019fd2b8-3ad6-716f-9be2-5f73c4f494f2
overall_score: 1
created_at: '2026-08-05 16:18'
tags:
- 'Mobile API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
overall_score:
type: integer
description: ''
examples:
- 1
punctuality_score:
type: integer
description: ''
examples:
- 1
professionalism_score:
type: integer
description: ''
examples:
- 1
communication_score:
type: integer
description: ''
examples:
- 1
work_environment_score:
type: integer
description: ''
examples:
- 1
comment:
type: string
description: ''
examples:
- Beispieltext
is_anonymous:
type: boolean
description: ''
examples:
- true
required:
- overall_score
parameters:
-
in: path
name: shiftId
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
/api/v1/mobile/ratings/received:
get:
summary: 'List Received Ratings'
operationId: listReceivedRatings
description: 'List the ratings a worker has received from companies.'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
average_overall:
type:
- string
- 'null'
examples:
- null
count:
type: integer
examples:
- 0
ratings:
type: array
examples:
- []
examples:
-
status: SUCCESS
data:
average_overall: null
count: 0
ratings: []
tags:
- 'Mobile API'
/api/v1/mobile/devices/register:
post:
summary: "Register (or refresh) the authenticated user's push-notification device token."
operationId: registerorRefreshTheAuthenticatedUsersPushNotificationDeviceToken
description: "The Firebase Cloud Messaging token is unique per device install; re-posting an\nexisting token re-binds it to the current user (e.g. after an account switch)\nand refreshes its platform/name. Idempotent by token."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Device registered for push notifications.'
data:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-3240-70a0-be56-989736211eff
platform:
type: string
examples:
- ios
examples:
-
status: SUCCESS
message: 'Device registered for push notifications.'
data:
id: 019fd2b8-3240-70a0-be56-989736211eff
platform: ios
tags:
- 'Mobile API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
token:
type: string
description: 'The FCM/APNs device token.'
examples:
- fADc...9x
platform:
type: string
description: 'One of ios, android, web.'
examples:
- ios
device_name:
type: string
description: 'optional A human-readable device label.'
examples:
- 'iPhone 15 Pro'
required:
- token
- platform
/api/v1/mobile/devices/unregister:
post:
summary: 'Unregister a push-notification device token'
operationId: unregisterAPushNotificationDeviceToken
description: "Removes the token so this device stops receiving notifications for the\nauthenticated user. Idempotent: unregistering a token that is already\ngone, or one belonging to someone else, reports success without touching\nanother account's registration."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Device unregistered from push notifications.'
data:
type: object
properties:
removed:
type: boolean
examples:
- false
examples:
-
status: SUCCESS
message: 'Device unregistered from push notifications.'
data:
removed: false
tags:
- 'Mobile API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
token:
type: string
description: 'The FCM/APNs device token to drop.'
examples:
- fADc...9x
required:
- token
/api/v1/mobile/notifications:
get:
summary: 'List Notifications'
operationId: listNotifications
description: "Paginated list of notifications for the authenticated user.\nIncludes an `unread_count` in `meta` for the inbox badge."
parameters:
-
in: query
name: page
description: 'Defaults to 1.'
required: false
schema:
type: integer
description: 'Defaults to 1.'
examples:
- 16
-
in: query
name: per_page
description: 'Defaults to 20 (max 100).'
required: false
schema:
type: integer
description: 'Defaults to 20 (max 100).'
examples:
- 16
-
in: query
name: unread_only
description: 'nullable When true, returns only unread notifications.'
required: false
schema:
type: boolean
description: 'nullable When true, returns only unread notifications.'
examples:
- false
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Notifications retrieved successfully.'
data:
type: array
examples:
- []
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- c7eb899a-5227-4d81-bdbb-845ed39a9963
timestamp:
type: string
examples:
- '2026-08-05T16:18:36.098962Z'
current_page:
type: integer
examples:
- 16
per_page:
type: integer
examples:
- 16
total:
type: integer
examples:
- 0
last_page:
type: integer
examples:
- 1
unread_count:
type: integer
examples:
- 0
examples:
-
status: SUCCESS
message: 'Notifications retrieved successfully.'
data: []
errors: null
meta:
request_id: c7eb899a-5227-4d81-bdbb-845ed39a9963
timestamp: '2026-08-05T16:18:36.098962Z'
current_page: 16
per_page: 16
total: 0
last_page: 1
unread_count: 0
tags:
- 'Mobile API'
/api/v1/mobile/notifications/unread-count:
get:
summary: 'Get Unread Notification Count'
operationId: getUnreadNotificationCount
description: 'Returns the count of unread notifications for badge display.'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- Success
data:
type: object
properties:
unread_count:
type: integer
examples:
- 0
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- d37f478c-4c14-45ab-ac14-23580ddfa706
timestamp:
type: string
examples:
- '2026-08-05T16:18:36.105987Z'
examples:
-
status: SUCCESS
message: Success
data:
unread_count: 0
errors: null
meta:
request_id: d37f478c-4c14-45ab-ac14-23580ddfa706
timestamp: '2026-08-05T16:18:36.105987Z'
tags:
- 'Mobile API'
'/api/v1/mobile/notifications/{notification}/read':
post:
summary: 'Mark Notification Read'
operationId: markNotificationRead
description: 'Marks a single notification as read.'
parameters: []
responses:
200:
description: Success
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Notification marked as read.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-06-10T12:00:00.000000Z'
examples:
-
status: SUCCESS
message: 'Notification marked as read.'
data: null
errors: null
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-06-10T12:00:00.000000Z'
404:
description: 'Not Found'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- NOT_FOUND
message:
type: string
examples:
- 'Notification not found.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type:
- string
- 'null'
examples:
- null
message:
type: string
examples:
- 'Notification not found.'
examples:
-
-
field: null
message: 'Notification not found.'
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-06-10T12:00:00.000000Z'
examples:
-
status: NOT_FOUND
message: 'Notification not found.'
data: null
errors:
-
field: null
message: 'Notification not found.'
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-06-10T12:00:00.000000Z'
tags:
- 'Mobile API'
parameters:
-
in: path
name: notification
description: 'UUID of the notification.'
required: true
schema:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
/api/v1/mobile/notifications/read-all:
post:
summary: 'Mark All Notifications Read'
operationId: markAllNotificationsRead
description: 'Marks all unread notifications as read.'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'All notifications have been marked as read.'
data:
type: object
properties:
marked_count:
type: integer
examples:
- 0
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 431882ec-4bb8-4d4c-9b72-39376ca1eaa1
timestamp:
type: string
examples:
- '2026-08-05T16:18:36.115293Z'
examples:
-
status: SUCCESS
message: 'All notifications have been marked as read.'
data:
marked_count: 0
errors: null
meta:
request_id: 431882ec-4bb8-4d4c-9b72-39376ca1eaa1
timestamp: '2026-08-05T16:18:36.115293Z'
tags:
- 'Mobile API'
/api/v1/mobile/legal/documents:
get:
summary: 'List Legal Documents'
operationId: listLegalDocuments
description: 'Returns URLs and versions for all legal documents.'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- Success
data:
type: object
properties:
privacy_policy:
type: object
properties:
key:
type: string
examples:
- privacy_policy
url:
type: string
examples:
- 'http://localhost:8001/legal/privacy_policy'
version:
type: string
examples:
- '1'
title:
type: string
examples:
- Datenschutzerklärung
required:
type: boolean
examples:
- true
terms_of_service:
type: object
properties:
key:
type: string
examples:
- terms_of_service
url:
type: string
examples:
- 'http://localhost:8001/legal/terms_of_service'
version:
type: string
examples:
- '1'
title:
type: string
examples:
- 'Allgemeine Geschäftsbedingungen (AGB)'
required:
type: boolean
examples:
- true
employment_terms:
type: object
properties:
key:
type: string
examples:
- employment_terms
url:
type: string
examples:
- 'http://localhost:8001/legal/aug_info'
version:
type: string
examples:
- '1'
title:
type: string
examples:
- 'Information gemäß AÜG (Arbeitskräfteüberlassungsgesetz)'
required:
type: boolean
examples:
- true
cookie_policy:
type: object
properties:
key:
type: string
examples:
- cookie_policy
url:
type: string
examples:
- 'http://localhost:8001/legal/cookie_policy'
version:
type: string
examples:
- '1'
title:
type: string
examples:
- Cookie-Richtlinie
required:
type: boolean
examples:
- false
data_processing_agreement:
type: object
properties:
key:
type: string
examples:
- dpa
url:
type: string
examples:
- 'http://localhost:8001/legal/dpa'
version:
type: string
examples:
- '2026-06-01'
title:
type: string
examples:
- 'Data Processing Agreement'
required:
type: boolean
examples:
- false
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- e90e4da8-5533-4b6a-8c64-eee968de3e53
timestamp:
type: string
examples:
- '2026-08-05T16:18:34.398969Z'
examples:
-
status: SUCCESS
message: Success
data:
privacy_policy:
key: privacy_policy
url: 'http://localhost:8001/legal/privacy_policy'
version: '1'
title: Datenschutzerklärung
required: true
terms_of_service:
key: terms_of_service
url: 'http://localhost:8001/legal/terms_of_service'
version: '1'
title: 'Allgemeine Geschäftsbedingungen (AGB)'
required: true
employment_terms:
key: employment_terms
url: 'http://localhost:8001/legal/aug_info'
version: '1'
title: 'Information gemäß AÜG (Arbeitskräfteüberlassungsgesetz)'
required: true
cookie_policy:
key: cookie_policy
url: 'http://localhost:8001/legal/cookie_policy'
version: '1'
title: Cookie-Richtlinie
required: false
data_processing_agreement:
key: dpa
url: 'http://localhost:8001/legal/dpa'
version: '2026-06-01'
title: 'Data Processing Agreement'
required: false
errors: null
meta:
request_id: e90e4da8-5533-4b6a-8c64-eee968de3e53
timestamp: '2026-08-05T16:18:34.398969Z'
tags:
- 'Mobile API'
security: []
/api/v1/mobile/reference-data:
get:
summary: 'Reference Data'
operationId: referenceData
description: "The permitted values for the choices on the profile screens: genders,\nresidence bases, document types and countries. Labels are German, which\nis the language of the documents these describe.\n\nSafe to cache for a day — these change only when the platform does."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
genders:
type: array
items:
type: object
properties:
value:
type: string
examples:
- male
label:
type: string
examples:
- Männlich
examples:
-
-
value: male
label: Männlich
-
value: female
label: Weiblich
-
value: diverse
label: Divers
-
value: not_specified
label: 'Keine Angabe'
residence_statuses:
type: array
items:
type: object
properties:
value:
type: string
examples:
- AT_CITIZEN
label:
type: string
examples:
- 'Österreichische Staatsbürgerschaft'
examples:
-
-
value: AT_CITIZEN
label: 'Österreichische Staatsbürgerschaft'
-
value: EU_EEA
label: EU/EWR-Bürger
-
value: THIRD_COUNTRY
label: Drittstaatsangehörige(r)
document_types:
type: array
items:
type: object
properties:
value:
type: string
examples:
- passport
label:
type: string
examples:
- Passport
requires_expiry:
type: boolean
examples:
- true
is_work_authorisation:
type: boolean
examples:
- false
examples:
-
-
value: passport
label: Passport
requires_expiry: true
is_work_authorisation: false
-
value: id_card
label: 'ID card'
requires_expiry: true
is_work_authorisation: false
-
value: driver_license
label: "Driver's licence"
requires_expiry: true
is_work_authorisation: false
-
value: work_permit
label: 'Work permit'
requires_expiry: true
is_work_authorisation: true
-
value: residence_permit
label: 'Residence permit'
requires_expiry: true
is_work_authorisation: true
-
value: rot_weiss_rot_karte
label: 'Rot-Weiß-Rot card'
requires_expiry: true
is_work_authorisation: true
-
value: blue_card
label: 'EU Blue Card'
requires_expiry: true
is_work_authorisation: true
-
value: bank_statement
label: 'Bank statement'
requires_expiry: false
is_work_authorisation: false
-
value: proof_of_address
label: 'Proof of address'
requires_expiry: false
is_work_authorisation: false
-
value: social_insurance_card
label: 'Social insurance record'
requires_expiry: false
is_work_authorisation: false
-
value: tax_document
label: 'Tax document'
requires_expiry: false
is_work_authorisation: false
-
value: certification
label: Certification
requires_expiry: true
is_work_authorisation: false
-
value: health_certificate
label: 'Health certificate'
requires_expiry: true
is_work_authorisation: false
-
value: criminal_record_check
label: 'Criminal record check'
requires_expiry: false
is_work_authorisation: false
-
value: other
label: Other
requires_expiry: false
is_work_authorisation: false
countries:
type: array
items:
type: object
properties:
code:
type: string
examples:
- AF
name:
type: string
examples:
- Afghanistan
dial_code:
type: string
examples:
- '+93'
examples:
-
-
code: AF
name: Afghanistan
dial_code: '+93'
-
code: AL
name: Albania
dial_code: '+355'
-
code: DZ
name: Algeria
dial_code: '+213'
-
code: AS
name: 'American Samoa'
dial_code: '+1'
-
code: AD
name: Andorra
dial_code: '+376'
-
code: AO
name: Angola
dial_code: '+244'
-
code: AI
name: Anguilla
dial_code: '+1'
-
code: AQ
name: Antarctica
dial_code: null
-
code: AG
name: 'Antigua and Barbuda'
dial_code: '+1'
-
code: AR
name: Argentina
dial_code: '+54'
-
code: AM
name: Armenia
dial_code: '+374'
-
code: AW
name: Aruba
dial_code: '+297'
-
code: AU
name: Australia
dial_code: '+61'
-
code: AT
name: Austria
dial_code: '+43'
-
code: AZ
name: Azerbaijan
dial_code: '+994'
-
code: BS
name: Bahamas
dial_code: '+1'
-
code: BH
name: Bahrain
dial_code: '+973'
-
code: BD
name: Bangladesh
dial_code: '+880'
-
code: BB
name: Barbados
dial_code: '+1'
-
code: BY
name: Belarus
dial_code: '+375'
-
code: BE
name: Belgium
dial_code: '+32'
-
code: BZ
name: Belize
dial_code: '+501'
-
code: BJ
name: Benin
dial_code: '+229'
-
code: BM
name: Bermuda
dial_code: '+1'
-
code: BT
name: Bhutan
dial_code: '+975'
-
code: BO
name: Bolivia
dial_code: '+591'
-
code: BQ
name: 'Bonaire, Sint Eustatius and Saba'
dial_code: '+599'
-
code: BA
name: 'Bosnia and Herzegovina'
dial_code: '+387'
-
code: BW
name: Botswana
dial_code: '+267'
-
code: BV
name: 'Bouvet Island'
dial_code: null
-
code: BR
name: Brazil
dial_code: '+55'
-
code: IO
name: 'British Indian Ocean Territory'
dial_code: '+246'
-
code: VG
name: 'British Virgin Islands'
dial_code: '+1'
-
code: BN
name: Brunei
dial_code: '+673'
-
code: BG
name: Bulgaria
dial_code: '+359'
-
code: BF
name: 'Burkina Faso'
dial_code: '+226'
-
code: BI
name: Burundi
dial_code: '+257'
-
code: CV
name: 'Cabo Verde'
dial_code: '+238'
-
code: KH
name: Cambodia
dial_code: '+855'
-
code: CM
name: Cameroon
dial_code: '+237'
-
code: CA
name: Canada
dial_code: '+1'
-
code: KY
name: 'Cayman Islands'
dial_code: '+1'
-
code: CF
name: 'Central African Republic'
dial_code: '+236'
-
code: TD
name: Chad
dial_code: '+235'
-
code: CL
name: Chile
dial_code: '+56'
-
code: CN
name: China
dial_code: '+86'
-
code: CX
name: 'Christmas Island'
dial_code: '+61'
-
code: CC
name: 'Cocos (Keeling) Islands'
dial_code: '+61'
-
code: CO
name: Colombia
dial_code: '+57'
-
code: KM
name: Comoros
dial_code: '+269'
-
code: CD
name: 'Congo, Democratic Republic'
dial_code: '+243'
-
code: CG
name: 'Congo, Republic'
dial_code: '+242'
-
code: CK
name: 'Cook Islands'
dial_code: '+682'
-
code: CR
name: 'Costa Rica'
dial_code: '+506'
-
code: HR
name: Croatia
dial_code: '+385'
-
code: CU
name: Cuba
dial_code: '+53'
-
code: CW
name: Curaçao
dial_code: '+599'
-
code: CY
name: Cyprus
dial_code: '+357'
-
code: CZ
name: 'Czech Republic'
dial_code: '+420'
-
code: CI
name: "Côte d'Ivoire"
dial_code: '+225'
-
code: DK
name: Denmark
dial_code: '+45'
-
code: DJ
name: Djibouti
dial_code: '+253'
-
code: DM
name: Dominica
dial_code: '+1'
-
code: DO
name: 'Dominican Republic'
dial_code: '+1'
-
code: EC
name: Ecuador
dial_code: '+593'
-
code: EG
name: Egypt
dial_code: '+20'
-
code: SV
name: 'El Salvador'
dial_code: '+503'
-
code: GQ
name: 'Equatorial Guinea'
dial_code: '+240'
-
code: ER
name: Eritrea
dial_code: '+291'
-
code: EE
name: Estonia
dial_code: '+372'
-
code: SZ
name: Eswatini
dial_code: '+268'
-
code: ET
name: Ethiopia
dial_code: '+251'
-
code: FK
name: 'Falkland Islands'
dial_code: '+500'
-
code: FO
name: 'Faroe Islands'
dial_code: '+298'
-
code: FJ
name: Fiji
dial_code: '+679'
-
code: FI
name: Finland
dial_code: '+358'
-
code: FR
name: France
dial_code: '+33'
-
code: GF
name: 'French Guiana'
dial_code: '+594'
-
code: PF
name: 'French Polynesia'
dial_code: '+689'
-
code: TF
name: 'French Southern Territories'
dial_code: null
-
code: GA
name: Gabon
dial_code: '+241'
-
code: GM
name: Gambia
dial_code: '+220'
-
code: GE
name: Georgia
dial_code: '+995'
-
code: DE
name: Germany
dial_code: '+49'
-
code: GH
name: Ghana
dial_code: '+233'
-
code: GI
name: Gibraltar
dial_code: '+350'
-
code: GR
name: Greece
dial_code: '+30'
-
code: GL
name: Greenland
dial_code: '+299'
-
code: GD
name: Grenada
dial_code: '+1'
-
code: GP
name: Guadeloupe
dial_code: '+590'
-
code: GU
name: Guam
dial_code: '+1'
-
code: GT
name: Guatemala
dial_code: '+502'
-
code: GG
name: Guernsey
dial_code: '+44'
-
code: GN
name: Guinea
dial_code: '+224'
-
code: GW
name: Guinea-Bissau
dial_code: '+245'
-
code: GY
name: Guyana
dial_code: '+592'
-
code: HT
name: Haiti
dial_code: '+509'
-
code: HM
name: 'Heard Island and McDonald Islands'
dial_code: null
-
code: HN
name: Honduras
dial_code: '+504'
-
code: HK
name: 'Hong Kong'
dial_code: '+852'
-
code: HU
name: Hungary
dial_code: '+36'
-
code: IS
name: Iceland
dial_code: '+354'
-
code: IN
name: India
dial_code: '+91'
-
code: ID
name: Indonesia
dial_code: '+62'
-
code: IR
name: Iran
dial_code: '+98'
-
code: IQ
name: Iraq
dial_code: '+964'
-
code: IE
name: Ireland
dial_code: '+353'
-
code: IM
name: 'Isle of Man'
dial_code: '+44'
-
code: IL
name: Israel
dial_code: '+972'
-
code: IT
name: Italy
dial_code: '+39'
-
code: JM
name: Jamaica
dial_code: '+1'
-
code: JP
name: Japan
dial_code: '+81'
-
code: JE
name: Jersey
dial_code: '+44'
-
code: JO
name: Jordan
dial_code: '+962'
-
code: KZ
name: Kazakhstan
dial_code: '+7'
-
code: KE
name: Kenya
dial_code: '+254'
-
code: KI
name: Kiribati
dial_code: '+686'
-
code: XK
name: Kosovo
dial_code: '+383'
-
code: KW
name: Kuwait
dial_code: '+965'
-
code: KG
name: Kyrgyzstan
dial_code: '+996'
-
code: LA
name: Laos
dial_code: '+856'
-
code: LV
name: Latvia
dial_code: '+371'
-
code: LB
name: Lebanon
dial_code: '+961'
-
code: LS
name: Lesotho
dial_code: '+266'
-
code: LR
name: Liberia
dial_code: '+231'
-
code: LY
name: Libya
dial_code: '+218'
-
code: LI
name: Liechtenstein
dial_code: '+423'
-
code: LT
name: Lithuania
dial_code: '+370'
-
code: LU
name: Luxembourg
dial_code: '+352'
-
code: MO
name: Macao
dial_code: '+853'
-
code: MG
name: Madagascar
dial_code: '+261'
-
code: MW
name: Malawi
dial_code: '+265'
-
code: MY
name: Malaysia
dial_code: '+60'
-
code: MV
name: Maldives
dial_code: '+960'
-
code: ML
name: Mali
dial_code: '+223'
-
code: MT
name: Malta
dial_code: '+356'
-
code: MH
name: 'Marshall Islands'
dial_code: '+692'
-
code: MQ
name: Martinique
dial_code: '+596'
-
code: MR
name: Mauritania
dial_code: '+222'
-
code: MU
name: Mauritius
dial_code: '+230'
-
code: YT
name: Mayotte
dial_code: '+262'
-
code: MX
name: Mexico
dial_code: '+52'
-
code: FM
name: Micronesia
dial_code: '+691'
-
code: MD
name: Moldova
dial_code: '+373'
-
code: MC
name: Monaco
dial_code: '+377'
-
code: MN
name: Mongolia
dial_code: '+976'
-
code: ME
name: Montenegro
dial_code: '+382'
-
code: MS
name: Montserrat
dial_code: '+1'
-
code: MA
name: Morocco
dial_code: '+212'
-
code: MZ
name: Mozambique
dial_code: '+258'
-
code: MM
name: Myanmar
dial_code: '+95'
-
code: NA
name: Namibia
dial_code: '+264'
-
code: NR
name: Nauru
dial_code: '+674'
-
code: NP
name: Nepal
dial_code: '+977'
-
code: NL
name: Netherlands
dial_code: '+31'
-
code: NC
name: 'New Caledonia'
dial_code: '+687'
-
code: NZ
name: 'New Zealand'
dial_code: '+64'
-
code: NI
name: Nicaragua
dial_code: '+505'
-
code: NE
name: Niger
dial_code: '+227'
-
code: NG
name: Nigeria
dial_code: '+234'
-
code: NU
name: Niue
dial_code: '+683'
-
code: NF
name: 'Norfolk Island'
dial_code: '+672'
-
code: KP
name: 'North Korea'
dial_code: '+850'
-
code: MK
name: 'North Macedonia'
dial_code: '+389'
-
code: MP
name: 'Northern Mariana Islands'
dial_code: '+1'
-
code: 'NO'
name: Norway
dial_code: '+47'
-
code: OM
name: Oman
dial_code: '+968'
-
code: PK
name: Pakistan
dial_code: '+92'
-
code: PW
name: Palau
dial_code: '+680'
-
code: PS
name: Palestine
dial_code: '+970'
-
code: PA
name: Panama
dial_code: '+507'
-
code: PG
name: 'Papua New Guinea'
dial_code: '+675'
-
code: PY
name: Paraguay
dial_code: '+595'
-
code: PE
name: Peru
dial_code: '+51'
-
code: PH
name: Philippines
dial_code: '+63'
-
code: PN
name: 'Pitcairn Islands'
dial_code: '+64'
-
code: PL
name: Poland
dial_code: '+48'
-
code: PT
name: Portugal
dial_code: '+351'
-
code: PR
name: 'Puerto Rico'
dial_code: '+1'
-
code: QA
name: Qatar
dial_code: '+974'
-
code: RO
name: Romania
dial_code: '+40'
-
code: RU
name: Russia
dial_code: '+7'
-
code: RW
name: Rwanda
dial_code: '+250'
-
code: RE
name: Réunion
dial_code: '+262'
-
code: BL
name: 'Saint Barthélemy'
dial_code: '+590'
-
code: SH
name: 'Saint Helena'
dial_code: '+290'
-
code: KN
name: 'Saint Kitts and Nevis'
dial_code: '+1'
-
code: LC
name: 'Saint Lucia'
dial_code: '+1'
-
code: MF
name: 'Saint Martin'
dial_code: '+590'
-
code: PM
name: 'Saint Pierre and Miquelon'
dial_code: '+508'
-
code: VC
name: 'Saint Vincent and the Grenadines'
dial_code: '+1'
-
code: WS
name: Samoa
dial_code: '+685'
-
code: SM
name: 'San Marino'
dial_code: '+378'
-
code: SA
name: 'Saudi Arabia'
dial_code: '+966'
-
code: SN
name: Senegal
dial_code: '+221'
-
code: RS
name: Serbia
dial_code: '+381'
-
code: SC
name: Seychelles
dial_code: '+248'
-
code: SL
name: 'Sierra Leone'
dial_code: '+232'
-
code: SG
name: Singapore
dial_code: '+65'
-
code: SX
name: 'Sint Maarten'
dial_code: '+1'
-
code: SK
name: Slovakia
dial_code: '+421'
-
code: SI
name: Slovenia
dial_code: '+386'
-
code: SB
name: 'Solomon Islands'
dial_code: '+677'
-
code: SO
name: Somalia
dial_code: '+252'
-
code: ZA
name: 'South Africa'
dial_code: '+27'
-
code: GS
name: 'South Georgia and South Sandwich'
dial_code: null
-
code: KR
name: 'South Korea'
dial_code: '+82'
-
code: SS
name: 'South Sudan'
dial_code: '+211'
-
code: ES
name: Spain
dial_code: '+34'
-
code: LK
name: 'Sri Lanka'
dial_code: '+94'
-
code: SD
name: Sudan
dial_code: '+249'
-
code: SR
name: Suriname
dial_code: '+597'
-
code: SJ
name: 'Svalbard and Jan Mayen'
dial_code: '+47'
-
code: SE
name: Sweden
dial_code: '+46'
-
code: CH
name: Switzerland
dial_code: '+41'
-
code: SY
name: Syria
dial_code: '+963'
-
code: ST
name: 'São Tomé and Príncipe'
dial_code: '+239'
-
code: TW
name: Taiwan
dial_code: '+886'
-
code: TJ
name: Tajikistan
dial_code: '+992'
-
code: TZ
name: Tanzania
dial_code: '+255'
-
code: TH
name: Thailand
dial_code: '+66'
-
code: TL
name: Timor-Leste
dial_code: '+670'
-
code: TG
name: Togo
dial_code: '+228'
-
code: TK
name: Tokelau
dial_code: '+690'
-
code: TO
name: Tonga
dial_code: '+676'
-
code: TT
name: 'Trinidad and Tobago'
dial_code: '+1'
-
code: TN
name: Tunisia
dial_code: '+216'
-
code: TR
name: Turkey
dial_code: '+90'
-
code: TM
name: Turkmenistan
dial_code: '+993'
-
code: TC
name: 'Turks and Caicos Islands'
dial_code: '+1'
-
code: TV
name: Tuvalu
dial_code: '+688'
-
code: UM
name: 'U.S. Minor Outlying Islands'
dial_code: '+1'
-
code: VI
name: 'U.S. Virgin Islands'
dial_code: '+1'
-
code: UG
name: Uganda
dial_code: '+256'
-
code: UA
name: Ukraine
dial_code: '+380'
-
code: AE
name: 'United Arab Emirates'
dial_code: '+971'
-
code: GB
name: 'United Kingdom'
dial_code: '+44'
-
code: US
name: 'United States'
dial_code: '+1'
-
code: UY
name: Uruguay
dial_code: '+598'
-
code: UZ
name: Uzbekistan
dial_code: '+998'
-
code: VU
name: Vanuatu
dial_code: '+678'
-
code: VA
name: 'Vatican City'
dial_code: '+39'
-
code: VE
name: Venezuela
dial_code: '+58'
-
code: VN
name: Vietnam
dial_code: '+84'
-
code: WF
name: 'Wallis and Futuna'
dial_code: '+681'
-
code: EH
name: 'Western Sahara'
dial_code: '+212'
-
code: YE
name: Yemen
dial_code: '+967'
-
code: ZM
name: Zambia
dial_code: '+260'
-
code: ZW
name: Zimbabwe
dial_code: '+263'
-
code: AX
name: 'Åland Islands'
dial_code: '+358'
examples:
-
status: SUCCESS
data:
genders:
-
value: male
label: Männlich
-
value: female
label: Weiblich
-
value: diverse
label: Divers
-
value: not_specified
label: 'Keine Angabe'
residence_statuses:
-
value: AT_CITIZEN
label: 'Österreichische Staatsbürgerschaft'
-
value: EU_EEA
label: EU/EWR-Bürger
-
value: THIRD_COUNTRY
label: Drittstaatsangehörige(r)
document_types:
-
value: passport
label: Passport
requires_expiry: true
is_work_authorisation: false
-
value: id_card
label: 'ID card'
requires_expiry: true
is_work_authorisation: false
-
value: driver_license
label: "Driver's licence"
requires_expiry: true
is_work_authorisation: false
-
value: work_permit
label: 'Work permit'
requires_expiry: true
is_work_authorisation: true
-
value: residence_permit
label: 'Residence permit'
requires_expiry: true
is_work_authorisation: true
-
value: rot_weiss_rot_karte
label: 'Rot-Weiß-Rot card'
requires_expiry: true
is_work_authorisation: true
-
value: blue_card
label: 'EU Blue Card'
requires_expiry: true
is_work_authorisation: true
-
value: bank_statement
label: 'Bank statement'
requires_expiry: false
is_work_authorisation: false
-
value: proof_of_address
label: 'Proof of address'
requires_expiry: false
is_work_authorisation: false
-
value: social_insurance_card
label: 'Social insurance record'
requires_expiry: false
is_work_authorisation: false
-
value: tax_document
label: 'Tax document'
requires_expiry: false
is_work_authorisation: false
-
value: certification
label: Certification
requires_expiry: true
is_work_authorisation: false
-
value: health_certificate
label: 'Health certificate'
requires_expiry: true
is_work_authorisation: false
-
value: criminal_record_check
label: 'Criminal record check'
requires_expiry: false
is_work_authorisation: false
-
value: other
label: Other
requires_expiry: false
is_work_authorisation: false
countries:
-
code: AF
name: Afghanistan
dial_code: '+93'
-
code: AL
name: Albania
dial_code: '+355'
-
code: DZ
name: Algeria
dial_code: '+213'
-
code: AS
name: 'American Samoa'
dial_code: '+1'
-
code: AD
name: Andorra
dial_code: '+376'
-
code: AO
name: Angola
dial_code: '+244'
-
code: AI
name: Anguilla
dial_code: '+1'
-
code: AQ
name: Antarctica
dial_code: null
-
code: AG
name: 'Antigua and Barbuda'
dial_code: '+1'
-
code: AR
name: Argentina
dial_code: '+54'
-
code: AM
name: Armenia
dial_code: '+374'
-
code: AW
name: Aruba
dial_code: '+297'
-
code: AU
name: Australia
dial_code: '+61'
-
code: AT
name: Austria
dial_code: '+43'
-
code: AZ
name: Azerbaijan
dial_code: '+994'
-
code: BS
name: Bahamas
dial_code: '+1'
-
code: BH
name: Bahrain
dial_code: '+973'
-
code: BD
name: Bangladesh
dial_code: '+880'
-
code: BB
name: Barbados
dial_code: '+1'
-
code: BY
name: Belarus
dial_code: '+375'
-
code: BE
name: Belgium
dial_code: '+32'
-
code: BZ
name: Belize
dial_code: '+501'
-
code: BJ
name: Benin
dial_code: '+229'
-
code: BM
name: Bermuda
dial_code: '+1'
-
code: BT
name: Bhutan
dial_code: '+975'
-
code: BO
name: Bolivia
dial_code: '+591'
-
code: BQ
name: 'Bonaire, Sint Eustatius and Saba'
dial_code: '+599'
-
code: BA
name: 'Bosnia and Herzegovina'
dial_code: '+387'
-
code: BW
name: Botswana
dial_code: '+267'
-
code: BV
name: 'Bouvet Island'
dial_code: null
-
code: BR
name: Brazil
dial_code: '+55'
-
code: IO
name: 'British Indian Ocean Territory'
dial_code: '+246'
-
code: VG
name: 'British Virgin Islands'
dial_code: '+1'
-
code: BN
name: Brunei
dial_code: '+673'
-
code: BG
name: Bulgaria
dial_code: '+359'
-
code: BF
name: 'Burkina Faso'
dial_code: '+226'
-
code: BI
name: Burundi
dial_code: '+257'
-
code: CV
name: 'Cabo Verde'
dial_code: '+238'
-
code: KH
name: Cambodia
dial_code: '+855'
-
code: CM
name: Cameroon
dial_code: '+237'
-
code: CA
name: Canada
dial_code: '+1'
-
code: KY
name: 'Cayman Islands'
dial_code: '+1'
-
code: CF
name: 'Central African Republic'
dial_code: '+236'
-
code: TD
name: Chad
dial_code: '+235'
-
code: CL
name: Chile
dial_code: '+56'
-
code: CN
name: China
dial_code: '+86'
-
code: CX
name: 'Christmas Island'
dial_code: '+61'
-
code: CC
name: 'Cocos (Keeling) Islands'
dial_code: '+61'
-
code: CO
name: Colombia
dial_code: '+57'
-
code: KM
name: Comoros
dial_code: '+269'
-
code: CD
name: 'Congo, Democratic Republic'
dial_code: '+243'
-
code: CG
name: 'Congo, Republic'
dial_code: '+242'
-
code: CK
name: 'Cook Islands'
dial_code: '+682'
-
code: CR
name: 'Costa Rica'
dial_code: '+506'
-
code: HR
name: Croatia
dial_code: '+385'
-
code: CU
name: Cuba
dial_code: '+53'
-
code: CW
name: Curaçao
dial_code: '+599'
-
code: CY
name: Cyprus
dial_code: '+357'
-
code: CZ
name: 'Czech Republic'
dial_code: '+420'
-
code: CI
name: "Côte d'Ivoire"
dial_code: '+225'
-
code: DK
name: Denmark
dial_code: '+45'
-
code: DJ
name: Djibouti
dial_code: '+253'
-
code: DM
name: Dominica
dial_code: '+1'
-
code: DO
name: 'Dominican Republic'
dial_code: '+1'
-
code: EC
name: Ecuador
dial_code: '+593'
-
code: EG
name: Egypt
dial_code: '+20'
-
code: SV
name: 'El Salvador'
dial_code: '+503'
-
code: GQ
name: 'Equatorial Guinea'
dial_code: '+240'
-
code: ER
name: Eritrea
dial_code: '+291'
-
code: EE
name: Estonia
dial_code: '+372'
-
code: SZ
name: Eswatini
dial_code: '+268'
-
code: ET
name: Ethiopia
dial_code: '+251'
-
code: FK
name: 'Falkland Islands'
dial_code: '+500'
-
code: FO
name: 'Faroe Islands'
dial_code: '+298'
-
code: FJ
name: Fiji
dial_code: '+679'
-
code: FI
name: Finland
dial_code: '+358'
-
code: FR
name: France
dial_code: '+33'
-
code: GF
name: 'French Guiana'
dial_code: '+594'
-
code: PF
name: 'French Polynesia'
dial_code: '+689'
-
code: TF
name: 'French Southern Territories'
dial_code: null
-
code: GA
name: Gabon
dial_code: '+241'
-
code: GM
name: Gambia
dial_code: '+220'
-
code: GE
name: Georgia
dial_code: '+995'
-
code: DE
name: Germany
dial_code: '+49'
-
code: GH
name: Ghana
dial_code: '+233'
-
code: GI
name: Gibraltar
dial_code: '+350'
-
code: GR
name: Greece
dial_code: '+30'
-
code: GL
name: Greenland
dial_code: '+299'
-
code: GD
name: Grenada
dial_code: '+1'
-
code: GP
name: Guadeloupe
dial_code: '+590'
-
code: GU
name: Guam
dial_code: '+1'
-
code: GT
name: Guatemala
dial_code: '+502'
-
code: GG
name: Guernsey
dial_code: '+44'
-
code: GN
name: Guinea
dial_code: '+224'
-
code: GW
name: Guinea-Bissau
dial_code: '+245'
-
code: GY
name: Guyana
dial_code: '+592'
-
code: HT
name: Haiti
dial_code: '+509'
-
code: HM
name: 'Heard Island and McDonald Islands'
dial_code: null
-
code: HN
name: Honduras
dial_code: '+504'
-
code: HK
name: 'Hong Kong'
dial_code: '+852'
-
code: HU
name: Hungary
dial_code: '+36'
-
code: IS
name: Iceland
dial_code: '+354'
-
code: IN
name: India
dial_code: '+91'
-
code: ID
name: Indonesia
dial_code: '+62'
-
code: IR
name: Iran
dial_code: '+98'
-
code: IQ
name: Iraq
dial_code: '+964'
-
code: IE
name: Ireland
dial_code: '+353'
-
code: IM
name: 'Isle of Man'
dial_code: '+44'
-
code: IL
name: Israel
dial_code: '+972'
-
code: IT
name: Italy
dial_code: '+39'
-
code: JM
name: Jamaica
dial_code: '+1'
-
code: JP
name: Japan
dial_code: '+81'
-
code: JE
name: Jersey
dial_code: '+44'
-
code: JO
name: Jordan
dial_code: '+962'
-
code: KZ
name: Kazakhstan
dial_code: '+7'
-
code: KE
name: Kenya
dial_code: '+254'
-
code: KI
name: Kiribati
dial_code: '+686'
-
code: XK
name: Kosovo
dial_code: '+383'
-
code: KW
name: Kuwait
dial_code: '+965'
-
code: KG
name: Kyrgyzstan
dial_code: '+996'
-
code: LA
name: Laos
dial_code: '+856'
-
code: LV
name: Latvia
dial_code: '+371'
-
code: LB
name: Lebanon
dial_code: '+961'
-
code: LS
name: Lesotho
dial_code: '+266'
-
code: LR
name: Liberia
dial_code: '+231'
-
code: LY
name: Libya
dial_code: '+218'
-
code: LI
name: Liechtenstein
dial_code: '+423'
-
code: LT
name: Lithuania
dial_code: '+370'
-
code: LU
name: Luxembourg
dial_code: '+352'
-
code: MO
name: Macao
dial_code: '+853'
-
code: MG
name: Madagascar
dial_code: '+261'
-
code: MW
name: Malawi
dial_code: '+265'
-
code: MY
name: Malaysia
dial_code: '+60'
-
code: MV
name: Maldives
dial_code: '+960'
-
code: ML
name: Mali
dial_code: '+223'
-
code: MT
name: Malta
dial_code: '+356'
-
code: MH
name: 'Marshall Islands'
dial_code: '+692'
-
code: MQ
name: Martinique
dial_code: '+596'
-
code: MR
name: Mauritania
dial_code: '+222'
-
code: MU
name: Mauritius
dial_code: '+230'
-
code: YT
name: Mayotte
dial_code: '+262'
-
code: MX
name: Mexico
dial_code: '+52'
-
code: FM
name: Micronesia
dial_code: '+691'
-
code: MD
name: Moldova
dial_code: '+373'
-
code: MC
name: Monaco
dial_code: '+377'
-
code: MN
name: Mongolia
dial_code: '+976'
-
code: ME
name: Montenegro
dial_code: '+382'
-
code: MS
name: Montserrat
dial_code: '+1'
-
code: MA
name: Morocco
dial_code: '+212'
-
code: MZ
name: Mozambique
dial_code: '+258'
-
code: MM
name: Myanmar
dial_code: '+95'
-
code: NA
name: Namibia
dial_code: '+264'
-
code: NR
name: Nauru
dial_code: '+674'
-
code: NP
name: Nepal
dial_code: '+977'
-
code: NL
name: Netherlands
dial_code: '+31'
-
code: NC
name: 'New Caledonia'
dial_code: '+687'
-
code: NZ
name: 'New Zealand'
dial_code: '+64'
-
code: NI
name: Nicaragua
dial_code: '+505'
-
code: NE
name: Niger
dial_code: '+227'
-
code: NG
name: Nigeria
dial_code: '+234'
-
code: NU
name: Niue
dial_code: '+683'
-
code: NF
name: 'Norfolk Island'
dial_code: '+672'
-
code: KP
name: 'North Korea'
dial_code: '+850'
-
code: MK
name: 'North Macedonia'
dial_code: '+389'
-
code: MP
name: 'Northern Mariana Islands'
dial_code: '+1'
-
code: 'NO'
name: Norway
dial_code: '+47'
-
code: OM
name: Oman
dial_code: '+968'
-
code: PK
name: Pakistan
dial_code: '+92'
-
code: PW
name: Palau
dial_code: '+680'
-
code: PS
name: Palestine
dial_code: '+970'
-
code: PA
name: Panama
dial_code: '+507'
-
code: PG
name: 'Papua New Guinea'
dial_code: '+675'
-
code: PY
name: Paraguay
dial_code: '+595'
-
code: PE
name: Peru
dial_code: '+51'
-
code: PH
name: Philippines
dial_code: '+63'
-
code: PN
name: 'Pitcairn Islands'
dial_code: '+64'
-
code: PL
name: Poland
dial_code: '+48'
-
code: PT
name: Portugal
dial_code: '+351'
-
code: PR
name: 'Puerto Rico'
dial_code: '+1'
-
code: QA
name: Qatar
dial_code: '+974'
-
code: RO
name: Romania
dial_code: '+40'
-
code: RU
name: Russia
dial_code: '+7'
-
code: RW
name: Rwanda
dial_code: '+250'
-
code: RE
name: Réunion
dial_code: '+262'
-
code: BL
name: 'Saint Barthélemy'
dial_code: '+590'
-
code: SH
name: 'Saint Helena'
dial_code: '+290'
-
code: KN
name: 'Saint Kitts and Nevis'
dial_code: '+1'
-
code: LC
name: 'Saint Lucia'
dial_code: '+1'
-
code: MF
name: 'Saint Martin'
dial_code: '+590'
-
code: PM
name: 'Saint Pierre and Miquelon'
dial_code: '+508'
-
code: VC
name: 'Saint Vincent and the Grenadines'
dial_code: '+1'
-
code: WS
name: Samoa
dial_code: '+685'
-
code: SM
name: 'San Marino'
dial_code: '+378'
-
code: SA
name: 'Saudi Arabia'
dial_code: '+966'
-
code: SN
name: Senegal
dial_code: '+221'
-
code: RS
name: Serbia
dial_code: '+381'
-
code: SC
name: Seychelles
dial_code: '+248'
-
code: SL
name: 'Sierra Leone'
dial_code: '+232'
-
code: SG
name: Singapore
dial_code: '+65'
-
code: SX
name: 'Sint Maarten'
dial_code: '+1'
-
code: SK
name: Slovakia
dial_code: '+421'
-
code: SI
name: Slovenia
dial_code: '+386'
-
code: SB
name: 'Solomon Islands'
dial_code: '+677'
-
code: SO
name: Somalia
dial_code: '+252'
-
code: ZA
name: 'South Africa'
dial_code: '+27'
-
code: GS
name: 'South Georgia and South Sandwich'
dial_code: null
-
code: KR
name: 'South Korea'
dial_code: '+82'
-
code: SS
name: 'South Sudan'
dial_code: '+211'
-
code: ES
name: Spain
dial_code: '+34'
-
code: LK
name: 'Sri Lanka'
dial_code: '+94'
-
code: SD
name: Sudan
dial_code: '+249'
-
code: SR
name: Suriname
dial_code: '+597'
-
code: SJ
name: 'Svalbard and Jan Mayen'
dial_code: '+47'
-
code: SE
name: Sweden
dial_code: '+46'
-
code: CH
name: Switzerland
dial_code: '+41'
-
code: SY
name: Syria
dial_code: '+963'
-
code: ST
name: 'São Tomé and Príncipe'
dial_code: '+239'
-
code: TW
name: Taiwan
dial_code: '+886'
-
code: TJ
name: Tajikistan
dial_code: '+992'
-
code: TZ
name: Tanzania
dial_code: '+255'
-
code: TH
name: Thailand
dial_code: '+66'
-
code: TL
name: Timor-Leste
dial_code: '+670'
-
code: TG
name: Togo
dial_code: '+228'
-
code: TK
name: Tokelau
dial_code: '+690'
-
code: TO
name: Tonga
dial_code: '+676'
-
code: TT
name: 'Trinidad and Tobago'
dial_code: '+1'
-
code: TN
name: Tunisia
dial_code: '+216'
-
code: TR
name: Turkey
dial_code: '+90'
-
code: TM
name: Turkmenistan
dial_code: '+993'
-
code: TC
name: 'Turks and Caicos Islands'
dial_code: '+1'
-
code: TV
name: Tuvalu
dial_code: '+688'
-
code: UM
name: 'U.S. Minor Outlying Islands'
dial_code: '+1'
-
code: VI
name: 'U.S. Virgin Islands'
dial_code: '+1'
-
code: UG
name: Uganda
dial_code: '+256'
-
code: UA
name: Ukraine
dial_code: '+380'
-
code: AE
name: 'United Arab Emirates'
dial_code: '+971'
-
code: GB
name: 'United Kingdom'
dial_code: '+44'
-
code: US
name: 'United States'
dial_code: '+1'
-
code: UY
name: Uruguay
dial_code: '+598'
-
code: UZ
name: Uzbekistan
dial_code: '+998'
-
code: VU
name: Vanuatu
dial_code: '+678'
-
code: VA
name: 'Vatican City'
dial_code: '+39'
-
code: VE
name: Venezuela
dial_code: '+58'
-
code: VN
name: Vietnam
dial_code: '+84'
-
code: WF
name: 'Wallis and Futuna'
dial_code: '+681'
-
code: EH
name: 'Western Sahara'
dial_code: '+212'
-
code: YE
name: Yemen
dial_code: '+967'
-
code: ZM
name: Zambia
dial_code: '+260'
-
code: ZW
name: Zimbabwe
dial_code: '+263'
-
code: AX
name: 'Åland Islands'
dial_code: '+358'
tags:
- 'Mobile API'
security: []
'/api/v1/mobile/gdpr/export/{export_id}/download':
get:
summary: 'Download Data Export'
operationId: downloadDataExport
description: ''
parameters: []
responses:
503:
description: ''
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- ERROR
message:
type: string
examples:
- 'Service Unavailable'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type:
- string
- 'null'
examples:
- null
message:
type: string
examples:
- 'Service Unavailable'
examples:
-
-
field: null
message: 'Service Unavailable'
meta:
type: object
properties:
request_id:
type: string
examples:
- eb800bbb-4c83-4588-b389-7c02b8fdd66d
timestamp:
type: string
examples:
- '2026-08-21T05:14:32.739710Z'
examples:
-
status: ERROR
message: 'Service Unavailable'
data: null
errors:
-
field: null
message: 'Service Unavailable'
meta:
request_id: eb800bbb-4c83-4588-b389-7c02b8fdd66d
timestamp: '2026-08-21T05:14:32.739710Z'
tags:
- 'Mobile API'
security: []
parameters:
-
in: path
name: export_id
description: 'The ID of the export.'
required: true
schema:
type: string
examples:
- 019febec-0321-7368-9b4e-d906c6855bac
/api/v1/mobile/auth/biometric/login:
post:
summary: 'Biometric Login'
operationId: biometricLogin
description: "Exchange a device's biometric credential for a fresh session."
parameters: []
responses:
200:
description: 'Signed in'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Signed in.'
data:
type: object
properties:
token:
type: string
examples:
- 12|plain-access-token
refresh_token:
type: string
examples:
- 13|plain-refresh-token
biometric_token:
type: string
examples:
- 14|plain-biometric-token
expires_in:
type: integer
examples:
- 900
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-07-28T10:00:00.000000Z'
examples:
-
status: SUCCESS
message: 'Signed in.'
data:
token: 12|plain-access-token
refresh_token: 13|plain-refresh-token
biometric_token: 14|plain-biometric-token
expires_in: 900
errors: null
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-07-28T10:00:00.000000Z'
401:
description: 'Credential rejected'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- UNAUTHORIZED
message:
type: string
examples:
- 'This device is no longer enrolled.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type:
- string
- 'null'
examples:
- null
message:
type: string
examples:
- 'This device is no longer enrolled.'
examples:
-
-
field: null
message: 'This device is no longer enrolled.'
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-07-28T10:00:00.000000Z'
examples:
-
status: UNAUTHORIZED
message: 'This device is no longer enrolled.'
data: null
errors:
-
field: null
message: 'This device is no longer enrolled.'
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-07-28T10:00:00.000000Z'
tags:
- 'Mobile API'
/api/v1/mobile/dashboard:
get:
summary: 'Get Employee Dashboard (Home Screen)'
operationId: getEmployeeDashboardHomeScreen
description: "Returns the employee home screen data including:\n- Next upcoming shift (if any)\n- Profile completion progress\n- Popular jobs this week\n- Recently added jobs\n- Personalized recommendations"
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
user:
type: object
properties:
id:
type: string
examples:
- 019fd2b7-f271-73fd-8268-848be381e136
first_name:
type:
- string
- 'null'
examples:
- null
full_name:
type:
- string
- 'null'
examples:
- null
avatar_url:
type:
- string
- 'null'
examples:
- null
next_shift:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-28d3-70d7-92eb-f1bb1577acaf
status:
type: string
examples:
- signed
status_label:
type: string
examples:
- Unterschrieben
date:
type: string
examples:
- '2026-08-06'
start_time:
type: string
examples:
- '08:00:00'
end_time:
type: string
examples:
- '16:00:00'
location_name:
type: string
examples:
- Nolan-Roberts
location_address:
type: string
examples:
- "4309 O'Reilly Way Suite 012"
job:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-28c4-732f-a94c-fb5a71a7d682
title:
type: string
examples:
- Accountant
category:
type: object
properties:
id:
type: string
examples:
- 019fd2b7-f39f-73e6-870b-fe7584e4f9bc
slug:
type: string
examples:
- office
name:
type: string
examples:
- Büro
name_localized:
type: string
examples:
- Office
icon:
type: string
examples:
- briefcase
color:
type:
- string
- 'null'
examples:
- null
organization:
type: object
properties:
id:
type: string
examples:
- 019fd2b7-f072-7154-8961-5b324cc6c46c
name:
type: string
examples:
- Caritas
logo_url:
type:
- string
- 'null'
examples:
- null
profile_completion:
type: object
properties:
documents_percent:
type: integer
examples:
- 25
legal_info_percent:
type: integer
examples:
- 50
total_percent:
type: integer
examples:
- 50
is_complete:
type: boolean
examples:
- false
popular_jobs:
type: array
items:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-22cf-71c5-8edd-5e3ce9d29e8b
title:
type: string
examples:
- 'Promoter*in Vienna Marathon'
description:
type: string
examples:
- 'Für ein großes Outdoor-Event suchen wir Promoter*innen und Koordinator*innen. Teamgeist und Flexibilität sind gefragt.'
status:
type: string
examples:
- published
is_featured:
type: boolean
examples:
- false
category:
type: object
properties:
id:
type: string
examples:
- 019fd2b7-f398-7300-a216-c64584fea8f7
slug:
type: string
examples:
- event
name:
type: string
examples:
- Events
name_localized:
type: string
examples:
- Events
icon:
type: string
examples:
- calendar-star
color:
type:
- string
- 'null'
examples:
- null
tags:
type: array
items:
type: string
examples:
-
- Events
- Tagschicht
- Veranstaltungserfahrung
- Teamfähigkeit
organization:
type: object
properties:
id:
type: string
examples:
- 019fd2b7-f072-7154-8961-5b324cc6c46c
name:
type: string
examples:
- Caritas
logo_url:
type:
- string
- 'null'
examples:
- null
average_rating:
type:
- string
- 'null'
examples:
- null
location:
type: object
properties:
name:
type: string
examples:
- 'Promoter*in Vienna Marathon'
address:
type: string
examples:
- 'Hauptstraße 48, 1010 Wien'
city:
type: string
examples:
- Wien
postal_code:
type: string
examples:
- '1010'
lat:
type: number
examples:
- 48.2082
lng:
type: number
examples:
- 16.3738
distance_km:
type:
- string
- 'null'
examples:
- null
schedule:
type: object
properties:
start_date:
type: string
examples:
- '2026-08-26'
end_date:
type: string
examples:
- '2026-08-28'
shift_start_time:
type: string
examples:
- '09:00:00'
shift_end_time:
type: string
examples:
- '17:00:00'
shift_type:
type: string
examples:
- day
shift_type_label:
type: string
examples:
- Tagschicht
duration_hours:
type: integer
examples:
- 8
compensation:
type: object
properties:
hourly_rate_gross:
type: number
examples:
- 13.5
supplements:
type:
- string
- 'null'
examples:
- null
estimated_total_gross:
type:
- string
- 'null'
examples:
- null
currency:
type: string
examples:
- EUR
vacancies:
type: object
properties:
total:
type: integer
examples:
- 20
filled:
type: integer
examples:
- 0
available:
type: integer
examples:
- 20
deadlines:
type: object
properties:
application:
type: string
examples:
- '2026-08-23T00:00:00+00:00'
created_at:
type: string
examples:
- '2026-08-05T16:18:30+00:00'
is_saved:
type: boolean
examples:
- false
can_apply:
type: boolean
examples:
- false
rate:
type:
- string
- 'null'
examples:
- null
examples:
-
-
id: 019fd2b8-22cf-71c5-8edd-5e3ce9d29e8b
title: 'Promoter*in Vienna Marathon'
description: 'Für ein großes Outdoor-Event suchen wir Promoter*innen und Koordinator*innen. Teamgeist und Flexibilität sind gefragt.'
status: published
is_featured: false
category:
id: 019fd2b7-f398-7300-a216-c64584fea8f7
slug: event
name: Events
name_localized: Events
icon: calendar-star
color: null
tags:
- Events
- Tagschicht
- Veranstaltungserfahrung
- Teamfähigkeit
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
logo_url: null
average_rating: null
location:
name: 'Promoter*in Vienna Marathon'
address: 'Hauptstraße 48, 1010 Wien'
city: Wien
postal_code: '1010'
lat: 48.2082
lng: 16.3738
distance_km: null
schedule:
start_date: '2026-08-26'
end_date: '2026-08-28'
shift_start_time: '09:00:00'
shift_end_time: '17:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 13.5
supplements: null
estimated_total_gross: null
currency: EUR
vacancies:
total: 20
filled: 0
available: 20
deadlines:
application: '2026-08-23T00:00:00+00:00'
created_at: '2026-08-05T16:18:30+00:00'
is_saved: false
can_apply: false
rate: null
-
id: 019fd2b8-2599-7355-a7f1-dcb185b05faa
title: 'Rezeptionist*in Hotel Sacher'
description: 'Für unser Haus suchen wir freundliche und belastbare Mitarbeiter*innen für den Front- und Back-Office-Bereich.'
status: published
is_featured: false
category:
id: 019fd2b7-f375-724e-84b8-4f9647ef6419
slug: hotel
name: Hotellerie
name_localized: Hospitality
icon: hotel
color: null
tags:
- Hospitality
- Tagschicht
- Hotellerie-Erfahrung
- 'Deutsch B2'
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
logo_url: null
average_rating: null
location:
name: 'Rezeptionist*in Hotel Sacher'
address: 'Hauptstraße 87, 1010 Wien'
city: Wien
postal_code: '1010'
lat: 48.2034
lng: 16.3694
distance_km: null
schedule:
start_date: '2026-08-17'
end_date: '2026-08-19'
shift_start_time: '09:00:00'
shift_end_time: '17:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 17.5
supplements: null
estimated_total_gross: null
currency: EUR
vacancies:
total: 4
filled: 0
available: 4
deadlines:
application: '2026-08-14T00:00:00+00:00'
created_at: '2026-08-05T16:18:31+00:00'
is_saved: false
can_apply: false
rate: null
-
id: 019fd2b8-1f86-7376-9a3a-c072ab5675cb
title: 'Service-Mitarbeiter*in Wiener Prater Festival'
description: 'Wir suchen engagierte Service-Mitarbeiter*innen für unser Team. Du bringst Freude am Umgang mit Gästen mit und arbeitest gerne im Team.'
status: published
is_featured: false
category:
id: 019fd2b7-f371-732c-8cdb-6de13be42891
slug: gastro
name: Gastronomie
name_localized: Gastronomy
icon: utensils
color: null
tags:
- Gastronomy
- Tagschicht
- Serviceerfahrung
- 'Deutsch B2'
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
logo_url: null
average_rating: null
location:
name: 'Service-Mitarbeiter*in Wiener Prater Festival'
address: 'Hauptstraße 91, 1020 Wien'
city: Wien
postal_code: '1020'
lat: 48.2117
lng: 16.3969
distance_km: null
schedule:
start_date: '2026-08-19'
end_date: '2026-08-21'
shift_start_time: '09:00:00'
shift_end_time: '17:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 15.5
supplements: null
estimated_total_gross: null
currency: EUR
vacancies:
total: 12
filled: 0
available: 12
deadlines:
application: '2026-08-16T00:00:00+00:00'
created_at: '2026-08-05T16:18:29+00:00'
is_saved: false
can_apply: false
rate: null
-
id: 019fd2b8-21c8-72cc-80b1-47fd13450522
title: 'Barkeeper*in Sommernacht Open Air'
description: 'Wir suchen engagierte Service-Mitarbeiter*innen für unser Team. Du bringst Freude am Umgang mit Gästen mit und arbeitest gerne im Team.'
status: published
is_featured: false
category:
id: 019fd2b7-f371-732c-8cdb-6de13be42891
slug: gastro
name: Gastronomie
name_localized: Gastronomy
icon: utensils
color: null
tags:
- Gastronomy
- Nachtschicht
- Serviceerfahrung
- 'Deutsch B2'
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
logo_url: null
average_rating: null
location:
name: 'Barkeeper*in Sommernacht Open Air'
address: 'Hauptstraße 35, 1060 Wien'
city: Wien
postal_code: '1060'
lat: 48.1953
lng: 16.356
distance_km: null
schedule:
start_date: '2026-08-15'
end_date: '2026-08-17'
shift_start_time: '22:00:00'
shift_end_time: '06:00:00'
shift_type: night
shift_type_label: Nachtschicht
duration_hours: 8
compensation:
hourly_rate_gross: 16
supplements: null
estimated_total_gross: null
currency: EUR
vacancies:
total: 8
filled: 0
available: 8
deadlines:
application: '2026-08-12T00:00:00+00:00'
created_at: '2026-08-05T16:18:30+00:00'
is_saved: false
can_apply: false
rate: null
-
id: 019fd2b8-24b0-700a-ae2a-142f5e48aead
title: 'Lagerhelfer*in Logistikzentrum Inzersdorf'
description: 'Für unser Logistikzentrum suchen wir zuverlässige Helfer*innen. Körperliche Belastbarkeit und Pünktlichkeit sind Voraussetzung.'
status: published
is_featured: false
category:
id: 019fd2b7-f38b-7209-8b83-b345b172def2
slug: warehouse
name: Lager
name_localized: Warehouse
icon: industry
color: null
tags:
- Warehouse
- Nachtschicht
- 'Staplerführerschein von Vorteil'
- 'Körperliche Belastbarkeit'
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
logo_url: null
average_rating: null
location:
name: 'Lagerhelfer*in Logistikzentrum Inzersdorf'
address: 'Hauptstraße 28, 1230 Wien'
city: Wien
postal_code: '1230'
lat: 48.1454
lng: 16.3499
distance_km: null
schedule:
start_date: '2026-08-12'
end_date: '2026-08-14'
shift_start_time: '22:00:00'
shift_end_time: '06:00:00'
shift_type: night
shift_type_label: Nachtschicht
duration_hours: 8
compensation:
hourly_rate_gross: 14.8
supplements: null
estimated_total_gross: null
currency: EUR
vacancies:
total: 15
filled: 0
available: 15
deadlines:
application: '2026-08-09T00:00:00+00:00'
created_at: '2026-08-05T16:18:31+00:00'
is_saved: false
can_apply: false
rate: null
recent_jobs:
type: array
items:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-28c4-732f-a94c-fb5a71a7d682
title:
type: string
examples:
- Accountant
description:
type: string
examples:
- 'Ut nostrum rerum ut alias quia libero excepturi. Voluptatum et aut non quia quisquam molestias. Perferendis qui hic unde.'
status:
type: string
examples:
- active
is_featured:
type: boolean
examples:
- false
category:
type: object
properties:
id:
type: string
examples:
- 019fd2b7-f39f-73e6-870b-fe7584e4f9bc
slug:
type: string
examples:
- office
name:
type: string
examples:
- Büro
name_localized:
type: string
examples:
- Office
icon:
type: string
examples:
- briefcase
color:
type:
- string
- 'null'
examples:
- null
tags:
type: array
items:
type: string
examples:
-
- Office
- Nachtschicht
organization:
type: object
properties:
id:
type: string
examples:
- 019fd2b7-f072-7154-8961-5b324cc6c46c
name:
type: string
examples:
- Caritas
logo_url:
type:
- string
- 'null'
examples:
- null
average_rating:
type:
- string
- 'null'
examples:
- null
location:
type: object
properties:
name:
type: string
examples:
- 'Barrows, Christiansen and Jones'
address:
type: string
examples:
- '586 Tremaine Row'
city:
type: string
examples:
- 'East Eliseo'
postal_code:
type: string
examples:
- 10547-3697
lat:
type: number
examples:
- 46.931383
lng:
type: number
examples:
- 11.998284
distance_km:
type:
- string
- 'null'
examples:
- null
schedule:
type: object
properties:
start_date:
type: string
examples:
- '2026-08-12'
end_date:
type: string
examples:
- '2026-08-19'
shift_start_time:
type: string
examples:
- '01:49:00'
shift_end_time:
type: string
examples:
- '18:57:00'
shift_type:
type: string
examples:
- night
shift_type_label:
type: string
examples:
- Nachtschicht
duration_hours:
type: number
examples:
- 17.133333333333
compensation:
type: object
properties:
hourly_rate_gross:
type: number
examples:
- 32.08
supplements:
type: object
properties:
night:
type: number
examples: [0.7]
weekend:
type: number
examples: [3.86]
estimated_total_gross:
type:
- string
- 'null'
examples:
- null
currency:
type: string
examples:
- EUR
vacancies:
type: object
properties:
total:
type: integer
examples:
- 5
filled:
type: integer
examples:
- 0
available:
type: integer
examples:
- 5
deadlines:
type: object
properties:
application:
type: string
examples:
- '2026-09-05T16:18:32+00:00'
created_at:
type: string
examples:
- '2026-08-05T16:18:32+00:00'
is_saved:
type: boolean
examples:
- false
can_apply:
type: boolean
examples:
- true
rate:
type:
- string
- 'null'
examples:
- null
examples:
-
-
id: 019fd2b8-28c4-732f-a94c-fb5a71a7d682
title: Accountant
description: 'Ut nostrum rerum ut alias quia libero excepturi. Voluptatum et aut non quia quisquam molestias. Perferendis qui hic unde.'
status: active
is_featured: false
category:
id: 019fd2b7-f39f-73e6-870b-fe7584e4f9bc
slug: office
name: Büro
name_localized: Office
icon: briefcase
color: null
tags:
- Office
- Nachtschicht
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
logo_url: null
average_rating: null
location:
name: 'Barrows, Christiansen and Jones'
address: '586 Tremaine Row'
city: 'East Eliseo'
postal_code: 10547-3697
lat: 46.931383
lng: 11.998284
distance_km: null
schedule:
start_date: '2026-08-12'
end_date: '2026-08-19'
shift_start_time: '01:49:00'
shift_end_time: '18:57:00'
shift_type: night
shift_type_label: Nachtschicht
duration_hours: 17.133333333333
compensation:
hourly_rate_gross: 32.08
supplements:
night: 0.7
weekend: 3.86
estimated_total_gross: null
currency: EUR
vacancies:
total: 5
filled: 0
available: 5
deadlines:
application: '2026-09-05T16:18:32+00:00'
created_at: '2026-08-05T16:18:32+00:00'
is_saved: false
can_apply: true
rate: null
-
id: 019fd2b8-1405-709f-bca9-b0a418fb6a75
title: 'Silvesternacht Service'
description: 'Wir suchen motivierte Silvesternacht Service für unser engagiertes Team. Sie unterstützen uns bei der professionellen Gästebetreuung und sorgen für ein unvergessliches Erlebnis. Vorkenntnisse in der Gastronomie sind von Vorteil, aber nicht zwingend erforderlich.'
status: active
is_featured: false
category:
id: 019fd2b7-f371-732c-8cdb-6de13be42891
slug: gastro
name: Gastronomie
name_localized: Gastronomy
icon: utensils
color: null
tags:
- Gastronomy
- Nachtschicht
- 'HACCP Kenntnisse von Vorteil'
organization:
id: 019fd2b7-fe56-70d1-bb3a-641339ce636a
name: 'Lagerhaus Steiermark'
logo_url: null
average_rating: null
location:
name: 'Hotel Imperial Wien'
address: 'Kärntner Ring 16, 1015 Wien'
city: Wien
postal_code: '1010'
lat: 48.2082
lng: 16.3739
distance_km: null
schedule:
start_date: '2027-02-09'
end_date: '2027-02-10'
shift_start_time: '22:00:00'
shift_end_time: '06:00:00'
shift_type: night
shift_type_label: Nachtschicht
duration_hours: 8
compensation:
hourly_rate_gross: 25
supplements:
night_bonus: 50
holiday_bonus: 100
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 12
filled: 0
available: 12
deadlines:
application: '2027-02-04T16:18:26+00:00'
created_at: '2026-08-05T16:18:26+00:00'
is_saved: false
can_apply: true
rate: null
-
id: 019fd2b8-15b5-7019-8521-6ea79edc4ba5
title: 'Garderobenservice Ball'
description: 'Für unsere bevorstehende Veranstaltung suchen wir tatkräftige Unterstützung. Als Garderobenservice Ball sind Sie das Aushängeschild unserer Veranstaltung und sorgen für einen reibungslosen Ablauf.'
status: active
is_featured: false
category:
id: 019fd2b7-f398-7300-a216-c64584fea8f7
slug: event
name: Events
name_localized: Events
icon: calendar-star
color: null
tags:
- Events
- Tagschicht
organization:
id: 019fd2b7-ff32-7117-ab28-06e2d3082002
name: 'Bildungszentrum Mitte'
logo_url: null
average_rating: null
location:
name: 'Wiener Rathaus'
address: 'Friedrich-Schmidt-Platz 1, 1010 Wien'
city: Wien
postal_code: '1010'
lat: 48.2082
lng: 16.3739
distance_km: null
schedule:
start_date: '2027-01-22'
end_date: '2027-01-23'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 14.5
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 10
filled: 0
available: 10
deadlines:
application: '2027-01-19T16:18:26+00:00'
created_at: '2026-08-05T16:18:27+00:00'
is_saved: false
can_apply: true
rate: null
-
id: 019fd2b8-18d3-718f-bbe2-32c97903f559
title: 'Verkaufshilfe Weihnachtsgeschäft'
description: 'Für unser Retail-Team suchen wir freundliche und kundenorientierte Verkaufshilfe Weihnachtsgeschäft. Sie beraten unsere Kunden, wickeln Kassiervorgänge ab und sorgen für eine ansprechende Warenpräsentation.'
status: active
is_featured: false
category:
id: 019fd2b7-f37d-712d-92b3-aa5540f6b2a7
slug: retail
name: Einzelhandel
name_localized: Retail
icon: shopping-cart
color: null
tags:
- Retail
- Tagschicht
organization:
id: 019fd2b7-fca6-71cf-8683-c97f6f50a24a
name: 'Reinigungsservice Alpin'
logo_url: null
average_rating: null
location:
name: 'Wiener Innenstadt'
address: 'Kärntner Straße 15, 1010 Wien'
city: Wien
postal_code: '1010'
lat: 48.2082
lng: 16.3739
distance_km: null
schedule:
start_date: '2027-01-12'
end_date: '2027-02-01'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 13.5
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 10
filled: 0
available: 10
deadlines:
application: '2027-01-08T16:18:26+00:00'
created_at: '2026-08-05T16:18:28+00:00'
is_saved: false
can_apply: true
rate: null
-
id: 019fd2b8-13e2-7390-a987-e12b987cdbb8
title: 'Weihnachtsmarkt Servicekraft'
description: 'Wir suchen motivierte Weihnachtsmarkt Servicekraft für unser engagiertes Team. Sie unterstützen uns bei der professionellen Gästebetreuung und sorgen für ein unvergessliches Erlebnis. Vorkenntnisse in der Gastronomie sind von Vorteil, aber nicht zwingend erforderlich.'
status: active
is_featured: false
category:
id: 019fd2b7-f371-732c-8cdb-6de13be42891
slug: gastro
name: Gastronomie
name_localized: Gastronomy
icon: utensils
color: null
tags:
- Gastronomy
- Tagschicht
- 'HACCP Kenntnisse von Vorteil'
organization:
id: 019fd2b7-f91f-70cb-8409-8632db9df3c7
name: 'Sicherheitsdienst Österreich'
logo_url: null
average_rating: null
location:
name: 'Christkindlmarkt Rathausplatz'
address: 'Rathausplatz 1, 1010 Wien'
city: Wien
postal_code: '1010'
lat: 48.2082
lng: 16.3739
distance_km: null
schedule:
start_date: '2027-01-02'
end_date: '2027-02-01'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 14
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 30
filled: 0
available: 30
deadlines:
application: '2026-12-29T16:18:26+00:00'
created_at: '2026-08-05T16:18:26+00:00'
is_saved: false
can_apply: true
rate: null
recommended_jobs:
type: array
items:
type: object
properties:
job:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-1a90-7125-af02-72f37fef65ea
title:
type: string
examples:
- 'Backoffice Assistenz'
description:
type: string
examples:
- 'Wir suchen engagierte Backoffice Assistenz zur Verstärkung unseres Teams. Sie erwartet ein abwechslungsreiches Aufgabengebiet in einem dynamischen Umfeld.'
status:
type: string
examples:
- active
is_featured:
type: boolean
examples:
- false
category:
type: object
properties:
id:
type: string
examples: [019fd2b7-f39f-73e6-870b-fe7584e4f9bc]
slug:
type: string
examples: [office]
name:
type: string
examples: [Büro]
name_localized:
type: string
examples: [Office]
icon:
type: string
examples: [briefcase]
color:
type: [string, 'null']
examples: [null]
tags:
type: array
items:
type: string
examples:
-
- Office
- Tagschicht
organization:
type: object
properties:
id:
type: string
examples: [019fd2b7-f768-7325-b254-280a67b1a995]
name:
type: string
examples: ['Retail Services GmbH']
logo_url:
type: [string, 'null']
examples: [null]
average_rating:
type: [string, 'null']
examples: [null]
location:
type: object
properties:
name:
type: string
examples: ['Steuerberatung Wien']
address:
type: string
examples: ['Margaretenstraße 90, 1050 Wien']
city:
type: string
examples: [Wien]
postal_code:
type: string
examples: ['1050']
lat:
type: number
examples: [48.1944]
lng:
type: number
examples: [16.3585]
distance_km:
type: [string, 'null']
examples: [null]
schedule:
type: object
properties:
start_date:
type: string
examples: ['2026-08-15']
end_date:
type: string
examples: ['2026-09-04']
shift_start_time:
type: string
examples: ['08:00:00']
shift_end_time:
type: string
examples: ['16:00:00']
shift_type:
type: string
examples: [day]
shift_type_label:
type: string
examples: [Tagschicht]
duration_hours:
type: integer
examples: [8]
compensation:
type: object
properties:
hourly_rate_gross:
type: integer
examples: [16]
supplements:
type: object
properties: { weekend_bonus: { type: integer, examples: [8] } }
estimated_total_gross:
type: [string, 'null']
examples: [null]
currency:
type: string
examples: [EUR]
vacancies:
type: object
properties:
total:
type: integer
examples: [1]
filled:
type: integer
examples: [0]
available:
type: integer
examples: [1]
deadlines:
type: object
properties:
application:
type: string
examples: ['2026-08-10T16:18:26+00:00']
created_at:
type: string
examples:
- '2026-08-05T16:18:28+00:00'
is_saved:
type: boolean
examples:
- false
can_apply:
type: boolean
examples:
- true
rate:
type:
- string
- 'null'
examples:
- null
recommendation:
type: object
properties:
score:
type: number
examples:
- 61.5
reasons:
type: array
items:
type: string
examples:
-
- 'Passt zu Ihren Qualifikationen'
breakdown:
type: object
properties:
location:
type: integer
examples: [50]
qualifications:
type: integer
examples: [100]
category_history:
type: integer
examples: [10]
company_rating:
type: integer
examples: [50]
reliability:
type: integer
examples: [100]
examples:
-
-
job:
id: 019fd2b8-1a90-7125-af02-72f37fef65ea
title: 'Backoffice Assistenz'
description: 'Wir suchen engagierte Backoffice Assistenz zur Verstärkung unseres Teams. Sie erwartet ein abwechslungsreiches Aufgabengebiet in einem dynamischen Umfeld.'
status: active
is_featured: false
category:
id: 019fd2b7-f39f-73e6-870b-fe7584e4f9bc
slug: office
name: Büro
name_localized: Office
icon: briefcase
color: null
tags:
- Office
- Tagschicht
organization:
id: 019fd2b7-f768-7325-b254-280a67b1a995
name: 'Retail Services GmbH'
logo_url: null
average_rating: null
location:
name: 'Steuerberatung Wien'
address: 'Margaretenstraße 90, 1050 Wien'
city: Wien
postal_code: '1050'
lat: 48.1944
lng: 16.3585
distance_km: null
schedule:
start_date: '2026-08-15'
end_date: '2026-09-04'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 16
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 1
filled: 0
available: 1
deadlines:
application: '2026-08-10T16:18:26+00:00'
created_at: '2026-08-05T16:18:28+00:00'
is_saved: false
can_apply: true
rate: null
recommendation:
score: 61.5
reasons:
- 'Passt zu Ihren Qualifikationen'
breakdown:
location: 50
qualifications: 100
category_history: 10
company_rating: 50
reliability: 100
-
job:
id: 019fd2b8-1265-737c-ae21-e5265dc709d8
title: 'Servicekraft Restaurant Mitte'
description: 'Wir suchen motivierte Servicekraft Restaurant Mitte für unser engagiertes Team. Sie unterstützen uns bei der professionellen Gästebetreuung und sorgen für ein unvergessliches Erlebnis. Vorkenntnisse in der Gastronomie sind von Vorteil, aber nicht zwingend erforderlich.'
status: active
is_featured: false
category:
id: 019fd2b7-f371-732c-8cdb-6de13be42891
slug: gastro
name: Gastronomie
name_localized: Gastronomy
icon: utensils
color: null
tags:
- Gastronomy
- Tagschicht
- 'HACCP Kenntnisse von Vorteil'
organization:
id: 019fd2b7-ff32-7117-ab28-06e2d3082002
name: 'Bildungszentrum Mitte'
logo_url: null
average_rating: null
location:
name: 'Brasserie Mitte'
address: 'Schwarzenbergplatz 3, 1010 Wien'
city: Wien
postal_code: '1010'
lat: 48.2082
lng: 16.3739
distance_km: null
schedule:
start_date: '2026-08-10'
end_date: '2026-09-09'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 14.5
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 8
filled: 0
available: 8
deadlines:
application: '2026-08-07T16:18:26+00:00'
created_at: '2026-08-05T16:18:26+00:00'
is_saved: false
can_apply: true
rate: null
recommendation:
score: 60
reasons:
- 'Passt zu Ihren Qualifikationen'
breakdown:
location: 50
qualifications: 100
category_history: 0
company_rating: 50
reliability: 100
-
job:
id: 019fd2b8-1287-7146-a673-6798f3d03acc
title: 'Barkeeper Spätschicht Club'
description: 'Wir suchen motivierte Barkeeper Spätschicht Club für unser engagiertes Team. Sie unterstützen uns bei der professionellen Gästebetreuung und sorgen für ein unvergessliches Erlebnis. Vorkenntnisse in der Gastronomie sind von Vorteil, aber nicht zwingend erforderlich.'
status: active
is_featured: false
category:
id: 019fd2b7-f371-732c-8cdb-6de13be42891
slug: gastro
name: Gastronomie
name_localized: Gastronomy
icon: utensils
color: null
tags:
- Gastronomy
- Nachtschicht
- 'HACCP Kenntnisse von Vorteil'
organization:
id: 019fd2b7-f5ae-7390-a778-c08c8d56cdc0
name: 'Event Solutions Austria'
logo_url: null
average_rating: null
location:
name: 'Club Passage'
address: 'Babenbergerstraße 9, 1010 Wien'
city: Wien
postal_code: '1070'
lat: 48.2003
lng: 16.3465
distance_km: null
schedule:
start_date: '2026-08-08'
end_date: '2026-11-03'
shift_start_time: '22:00:00'
shift_end_time: '06:00:00'
shift_type: night
shift_type_label: Nachtschicht
duration_hours: 8
compensation:
hourly_rate_gross: 16
supplements:
night_bonus: 15
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 4
filled: 0
available: 4
deadlines:
application: '2026-08-06T16:18:26+00:00'
created_at: '2026-08-05T16:18:26+00:00'
is_saved: false
can_apply: true
rate: null
recommendation:
score: 60
reasons:
- 'Passt zu Ihren Qualifikationen'
breakdown:
location: 50
qualifications: 100
category_history: 0
company_rating: 50
reliability: 100
-
job:
id: 019fd2b8-1298-737e-bbfd-295992feb4db
title: 'Küchenhilfe Großküche'
description: 'Wir suchen motivierte Küchenhilfe Großküche für unser engagiertes Team. Sie unterstützen uns bei der professionellen Gästebetreuung und sorgen für ein unvergessliches Erlebnis. Vorkenntnisse in der Gastronomie sind von Vorteil, aber nicht zwingend erforderlich.'
status: active
is_featured: false
category:
id: 019fd2b7-f371-732c-8cdb-6de13be42891
slug: gastro
name: Gastronomie
name_localized: Gastronomy
icon: utensils
color: null
tags:
- Gastronomy
- Tagschicht
- 'HACCP Kenntnisse von Vorteil'
organization:
id: 019fd2b7-fad7-719c-887a-a0f510bbd31d
name: 'IT Solutions GmbH'
logo_url: null
average_rating: null
location:
name: 'SV Gastronomie Wien'
address: 'Gablenzgasse 11, 1150 Wien'
city: Wien
postal_code: '1150'
lat: 48.196
lng: 16.3268
distance_km: null
schedule:
start_date: '2026-08-12'
end_date: '2026-12-03'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 13.5
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 10
filled: 0
available: 10
deadlines:
application: '2026-08-07T16:18:26+00:00'
created_at: '2026-08-05T16:18:26+00:00'
is_saved: false
can_apply: true
rate: null
recommendation:
score: 60
reasons:
- 'Passt zu Ihren Qualifikationen'
breakdown:
location: 50
qualifications: 100
category_history: 0
company_rating: 50
reliability: 100
-
job:
id: 019fd2b8-12b2-72ff-8be7-dadbf8e167b6
title: 'Kellner*in Haubenrestaurant'
description: 'Wir suchen motivierte Kellner*in Haubenrestaurant für unser engagiertes Team. Sie unterstützen uns bei der professionellen Gästebetreuung und sorgen für ein unvergessliches Erlebnis. Vorkenntnisse in der Gastronomie sind von Vorteil, aber nicht zwingend erforderlich.'
status: active
is_featured: false
category:
id: 019fd2b7-f371-732c-8cdb-6de13be42891
slug: gastro
name: Gastronomie
name_localized: Gastronomy
icon: utensils
color: null
tags:
- Gastronomy
- Tagschicht
- 'HACCP Kenntnisse von Vorteil'
organization:
id: 019fd2b7-fca6-71cf-8683-c97f6f50a24a
name: 'Reinigungsservice Alpin'
logo_url: null
average_rating: null
location:
name: 'Restaurant Steirereck'
address: 'Am Heumarkt 2a, 1030 Wien'
city: Wien
postal_code: '1030'
lat: 48.2014
lng: 16.387
distance_km: null
schedule:
start_date: '2026-08-15'
end_date: '2026-10-04'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 15.5
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 3
filled: 0
available: 3
deadlines:
application: '2026-08-10T16:18:26+00:00'
created_at: '2026-08-05T16:18:26+00:00'
is_saved: false
can_apply: true
rate: null
recommendation:
score: 60
reasons:
- 'Passt zu Ihren Qualifikationen'
breakdown:
location: 50
qualifications: 100
category_history: 0
company_rating: 50
reliability: 100
-
job:
id: 019fd2b8-12c7-72ab-bd18-53060b989f57
title: 'Buffetkraft Messe'
description: 'Wir suchen motivierte Buffetkraft Messe für unser engagiertes Team. Sie unterstützen uns bei der professionellen Gästebetreuung und sorgen für ein unvergessliches Erlebnis. Vorkenntnisse in der Gastronomie sind von Vorteil, aber nicht zwingend erforderlich.'
status: active
is_featured: false
category:
id: 019fd2b7-f371-732c-8cdb-6de13be42891
slug: gastro
name: Gastronomie
name_localized: Gastronomy
icon: utensils
color: null
tags:
- Gastronomy
- Tagschicht
- 'HACCP Kenntnisse von Vorteil'
organization:
id: 019fd2b7-fe56-70d1-bb3a-641339ce636a
name: 'Lagerhaus Steiermark'
logo_url: null
average_rating: null
location:
name: 'Reed Messe Wien'
address: 'Messeplatz 1, 1021 Wien'
city: Wien
postal_code: '1020'
lat: 48.2176
lng: 16.4138
distance_km: null
schedule:
start_date: '2026-08-19'
end_date: '2026-08-21'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 13.8
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 15
filled: 0
available: 15
deadlines:
application: '2026-08-15T16:18:26+00:00'
created_at: '2026-08-05T16:18:26+00:00'
is_saved: false
can_apply: true
rate: null
recommendation:
score: 60
reasons:
- 'Passt zu Ihren Qualifikationen'
breakdown:
location: 50
qualifications: 100
category_history: 0
company_rating: 50
reliability: 100
examples:
-
status: SUCCESS
data:
user:
id: 019fd2b7-f271-73fd-8268-848be381e136
first_name: null
full_name: null
avatar_url: null
next_shift:
id: 019fd2b8-28d3-70d7-92eb-f1bb1577acaf
status: signed
status_label: Unterschrieben
date: '2026-08-06'
start_time: '08:00:00'
end_time: '16:00:00'
location_name: Nolan-Roberts
location_address: "4309 O'Reilly Way Suite 012"
job:
id: 019fd2b8-28c4-732f-a94c-fb5a71a7d682
title: Accountant
category:
id: 019fd2b7-f39f-73e6-870b-fe7584e4f9bc
slug: office
name: Büro
name_localized: Office
icon: briefcase
color: null
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
logo_url: null
profile_completion:
documents_percent: 25
legal_info_percent: 50
total_percent: 50
is_complete: false
popular_jobs:
-
id: 019fd2b8-22cf-71c5-8edd-5e3ce9d29e8b
title: 'Promoter*in Vienna Marathon'
description: 'Für ein großes Outdoor-Event suchen wir Promoter*innen und Koordinator*innen. Teamgeist und Flexibilität sind gefragt.'
status: published
is_featured: false
category:
id: 019fd2b7-f398-7300-a216-c64584fea8f7
slug: event
name: Events
name_localized: Events
icon: calendar-star
color: null
tags:
- Events
- Tagschicht
- Veranstaltungserfahrung
- Teamfähigkeit
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
logo_url: null
average_rating: null
location:
name: 'Promoter*in Vienna Marathon'
address: 'Hauptstraße 48, 1010 Wien'
city: Wien
postal_code: '1010'
lat: 48.2082
lng: 16.3738
distance_km: null
schedule:
start_date: '2026-08-26'
end_date: '2026-08-28'
shift_start_time: '09:00:00'
shift_end_time: '17:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 13.5
supplements: null
estimated_total_gross: null
currency: EUR
vacancies:
total: 20
filled: 0
available: 20
deadlines:
application: '2026-08-23T00:00:00+00:00'
created_at: '2026-08-05T16:18:30+00:00'
is_saved: false
can_apply: false
rate: null
-
id: 019fd2b8-2599-7355-a7f1-dcb185b05faa
title: 'Rezeptionist*in Hotel Sacher'
description: 'Für unser Haus suchen wir freundliche und belastbare Mitarbeiter*innen für den Front- und Back-Office-Bereich.'
status: published
is_featured: false
category:
id: 019fd2b7-f375-724e-84b8-4f9647ef6419
slug: hotel
name: Hotellerie
name_localized: Hospitality
icon: hotel
color: null
tags:
- Hospitality
- Tagschicht
- Hotellerie-Erfahrung
- 'Deutsch B2'
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
logo_url: null
average_rating: null
location:
name: 'Rezeptionist*in Hotel Sacher'
address: 'Hauptstraße 87, 1010 Wien'
city: Wien
postal_code: '1010'
lat: 48.2034
lng: 16.3694
distance_km: null
schedule:
start_date: '2026-08-17'
end_date: '2026-08-19'
shift_start_time: '09:00:00'
shift_end_time: '17:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 17.5
supplements: null
estimated_total_gross: null
currency: EUR
vacancies:
total: 4
filled: 0
available: 4
deadlines:
application: '2026-08-14T00:00:00+00:00'
created_at: '2026-08-05T16:18:31+00:00'
is_saved: false
can_apply: false
rate: null
-
id: 019fd2b8-1f86-7376-9a3a-c072ab5675cb
title: 'Service-Mitarbeiter*in Wiener Prater Festival'
description: 'Wir suchen engagierte Service-Mitarbeiter*innen für unser Team. Du bringst Freude am Umgang mit Gästen mit und arbeitest gerne im Team.'
status: published
is_featured: false
category:
id: 019fd2b7-f371-732c-8cdb-6de13be42891
slug: gastro
name: Gastronomie
name_localized: Gastronomy
icon: utensils
color: null
tags:
- Gastronomy
- Tagschicht
- Serviceerfahrung
- 'Deutsch B2'
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
logo_url: null
average_rating: null
location:
name: 'Service-Mitarbeiter*in Wiener Prater Festival'
address: 'Hauptstraße 91, 1020 Wien'
city: Wien
postal_code: '1020'
lat: 48.2117
lng: 16.3969
distance_km: null
schedule:
start_date: '2026-08-19'
end_date: '2026-08-21'
shift_start_time: '09:00:00'
shift_end_time: '17:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 15.5
supplements: null
estimated_total_gross: null
currency: EUR
vacancies:
total: 12
filled: 0
available: 12
deadlines:
application: '2026-08-16T00:00:00+00:00'
created_at: '2026-08-05T16:18:29+00:00'
is_saved: false
can_apply: false
rate: null
-
id: 019fd2b8-21c8-72cc-80b1-47fd13450522
title: 'Barkeeper*in Sommernacht Open Air'
description: 'Wir suchen engagierte Service-Mitarbeiter*innen für unser Team. Du bringst Freude am Umgang mit Gästen mit und arbeitest gerne im Team.'
status: published
is_featured: false
category:
id: 019fd2b7-f371-732c-8cdb-6de13be42891
slug: gastro
name: Gastronomie
name_localized: Gastronomy
icon: utensils
color: null
tags:
- Gastronomy
- Nachtschicht
- Serviceerfahrung
- 'Deutsch B2'
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
logo_url: null
average_rating: null
location:
name: 'Barkeeper*in Sommernacht Open Air'
address: 'Hauptstraße 35, 1060 Wien'
city: Wien
postal_code: '1060'
lat: 48.1953
lng: 16.356
distance_km: null
schedule:
start_date: '2026-08-15'
end_date: '2026-08-17'
shift_start_time: '22:00:00'
shift_end_time: '06:00:00'
shift_type: night
shift_type_label: Nachtschicht
duration_hours: 8
compensation:
hourly_rate_gross: 16
supplements: null
estimated_total_gross: null
currency: EUR
vacancies:
total: 8
filled: 0
available: 8
deadlines:
application: '2026-08-12T00:00:00+00:00'
created_at: '2026-08-05T16:18:30+00:00'
is_saved: false
can_apply: false
rate: null
-
id: 019fd2b8-24b0-700a-ae2a-142f5e48aead
title: 'Lagerhelfer*in Logistikzentrum Inzersdorf'
description: 'Für unser Logistikzentrum suchen wir zuverlässige Helfer*innen. Körperliche Belastbarkeit und Pünktlichkeit sind Voraussetzung.'
status: published
is_featured: false
category:
id: 019fd2b7-f38b-7209-8b83-b345b172def2
slug: warehouse
name: Lager
name_localized: Warehouse
icon: industry
color: null
tags:
- Warehouse
- Nachtschicht
- 'Staplerführerschein von Vorteil'
- 'Körperliche Belastbarkeit'
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
logo_url: null
average_rating: null
location:
name: 'Lagerhelfer*in Logistikzentrum Inzersdorf'
address: 'Hauptstraße 28, 1230 Wien'
city: Wien
postal_code: '1230'
lat: 48.1454
lng: 16.3499
distance_km: null
schedule:
start_date: '2026-08-12'
end_date: '2026-08-14'
shift_start_time: '22:00:00'
shift_end_time: '06:00:00'
shift_type: night
shift_type_label: Nachtschicht
duration_hours: 8
compensation:
hourly_rate_gross: 14.8
supplements: null
estimated_total_gross: null
currency: EUR
vacancies:
total: 15
filled: 0
available: 15
deadlines:
application: '2026-08-09T00:00:00+00:00'
created_at: '2026-08-05T16:18:31+00:00'
is_saved: false
can_apply: false
rate: null
recent_jobs:
-
id: 019fd2b8-28c4-732f-a94c-fb5a71a7d682
title: Accountant
description: 'Ut nostrum rerum ut alias quia libero excepturi. Voluptatum et aut non quia quisquam molestias. Perferendis qui hic unde.'
status: active
is_featured: false
category:
id: 019fd2b7-f39f-73e6-870b-fe7584e4f9bc
slug: office
name: Büro
name_localized: Office
icon: briefcase
color: null
tags:
- Office
- Nachtschicht
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
logo_url: null
average_rating: null
location:
name: 'Barrows, Christiansen and Jones'
address: '586 Tremaine Row'
city: 'East Eliseo'
postal_code: 10547-3697
lat: 46.931383
lng: 11.998284
distance_km: null
schedule:
start_date: '2026-08-12'
end_date: '2026-08-19'
shift_start_time: '01:49:00'
shift_end_time: '18:57:00'
shift_type: night
shift_type_label: Nachtschicht
duration_hours: 17.133333333333
compensation:
hourly_rate_gross: 32.08
supplements:
night: 0.7
weekend: 3.86
estimated_total_gross: null
currency: EUR
vacancies:
total: 5
filled: 0
available: 5
deadlines:
application: '2026-09-05T16:18:32+00:00'
created_at: '2026-08-05T16:18:32+00:00'
is_saved: false
can_apply: true
rate: null
-
id: 019fd2b8-1405-709f-bca9-b0a418fb6a75
title: 'Silvesternacht Service'
description: 'Wir suchen motivierte Silvesternacht Service für unser engagiertes Team. Sie unterstützen uns bei der professionellen Gästebetreuung und sorgen für ein unvergessliches Erlebnis. Vorkenntnisse in der Gastronomie sind von Vorteil, aber nicht zwingend erforderlich.'
status: active
is_featured: false
category:
id: 019fd2b7-f371-732c-8cdb-6de13be42891
slug: gastro
name: Gastronomie
name_localized: Gastronomy
icon: utensils
color: null
tags:
- Gastronomy
- Nachtschicht
- 'HACCP Kenntnisse von Vorteil'
organization:
id: 019fd2b7-fe56-70d1-bb3a-641339ce636a
name: 'Lagerhaus Steiermark'
logo_url: null
average_rating: null
location:
name: 'Hotel Imperial Wien'
address: 'Kärntner Ring 16, 1015 Wien'
city: Wien
postal_code: '1010'
lat: 48.2082
lng: 16.3739
distance_km: null
schedule:
start_date: '2027-02-09'
end_date: '2027-02-10'
shift_start_time: '22:00:00'
shift_end_time: '06:00:00'
shift_type: night
shift_type_label: Nachtschicht
duration_hours: 8
compensation:
hourly_rate_gross: 25
supplements:
night_bonus: 50
holiday_bonus: 100
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 12
filled: 0
available: 12
deadlines:
application: '2027-02-04T16:18:26+00:00'
created_at: '2026-08-05T16:18:26+00:00'
is_saved: false
can_apply: true
rate: null
-
id: 019fd2b8-15b5-7019-8521-6ea79edc4ba5
title: 'Garderobenservice Ball'
description: 'Für unsere bevorstehende Veranstaltung suchen wir tatkräftige Unterstützung. Als Garderobenservice Ball sind Sie das Aushängeschild unserer Veranstaltung und sorgen für einen reibungslosen Ablauf.'
status: active
is_featured: false
category:
id: 019fd2b7-f398-7300-a216-c64584fea8f7
slug: event
name: Events
name_localized: Events
icon: calendar-star
color: null
tags:
- Events
- Tagschicht
organization:
id: 019fd2b7-ff32-7117-ab28-06e2d3082002
name: 'Bildungszentrum Mitte'
logo_url: null
average_rating: null
location:
name: 'Wiener Rathaus'
address: 'Friedrich-Schmidt-Platz 1, 1010 Wien'
city: Wien
postal_code: '1010'
lat: 48.2082
lng: 16.3739
distance_km: null
schedule:
start_date: '2027-01-22'
end_date: '2027-01-23'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 14.5
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 10
filled: 0
available: 10
deadlines:
application: '2027-01-19T16:18:26+00:00'
created_at: '2026-08-05T16:18:27+00:00'
is_saved: false
can_apply: true
rate: null
-
id: 019fd2b8-18d3-718f-bbe2-32c97903f559
title: 'Verkaufshilfe Weihnachtsgeschäft'
description: 'Für unser Retail-Team suchen wir freundliche und kundenorientierte Verkaufshilfe Weihnachtsgeschäft. Sie beraten unsere Kunden, wickeln Kassiervorgänge ab und sorgen für eine ansprechende Warenpräsentation.'
status: active
is_featured: false
category:
id: 019fd2b7-f37d-712d-92b3-aa5540f6b2a7
slug: retail
name: Einzelhandel
name_localized: Retail
icon: shopping-cart
color: null
tags:
- Retail
- Tagschicht
organization:
id: 019fd2b7-fca6-71cf-8683-c97f6f50a24a
name: 'Reinigungsservice Alpin'
logo_url: null
average_rating: null
location:
name: 'Wiener Innenstadt'
address: 'Kärntner Straße 15, 1010 Wien'
city: Wien
postal_code: '1010'
lat: 48.2082
lng: 16.3739
distance_km: null
schedule:
start_date: '2027-01-12'
end_date: '2027-02-01'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 13.5
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 10
filled: 0
available: 10
deadlines:
application: '2027-01-08T16:18:26+00:00'
created_at: '2026-08-05T16:18:28+00:00'
is_saved: false
can_apply: true
rate: null
-
id: 019fd2b8-13e2-7390-a987-e12b987cdbb8
title: 'Weihnachtsmarkt Servicekraft'
description: 'Wir suchen motivierte Weihnachtsmarkt Servicekraft für unser engagiertes Team. Sie unterstützen uns bei der professionellen Gästebetreuung und sorgen für ein unvergessliches Erlebnis. Vorkenntnisse in der Gastronomie sind von Vorteil, aber nicht zwingend erforderlich.'
status: active
is_featured: false
category:
id: 019fd2b7-f371-732c-8cdb-6de13be42891
slug: gastro
name: Gastronomie
name_localized: Gastronomy
icon: utensils
color: null
tags:
- Gastronomy
- Tagschicht
- 'HACCP Kenntnisse von Vorteil'
organization:
id: 019fd2b7-f91f-70cb-8409-8632db9df3c7
name: 'Sicherheitsdienst Österreich'
logo_url: null
average_rating: null
location:
name: 'Christkindlmarkt Rathausplatz'
address: 'Rathausplatz 1, 1010 Wien'
city: Wien
postal_code: '1010'
lat: 48.2082
lng: 16.3739
distance_km: null
schedule:
start_date: '2027-01-02'
end_date: '2027-02-01'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 14
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 30
filled: 0
available: 30
deadlines:
application: '2026-12-29T16:18:26+00:00'
created_at: '2026-08-05T16:18:26+00:00'
is_saved: false
can_apply: true
rate: null
recommended_jobs:
-
job:
id: 019fd2b8-1a90-7125-af02-72f37fef65ea
title: 'Backoffice Assistenz'
description: 'Wir suchen engagierte Backoffice Assistenz zur Verstärkung unseres Teams. Sie erwartet ein abwechslungsreiches Aufgabengebiet in einem dynamischen Umfeld.'
status: active
is_featured: false
category:
id: 019fd2b7-f39f-73e6-870b-fe7584e4f9bc
slug: office
name: Büro
name_localized: Office
icon: briefcase
color: null
tags:
- Office
- Tagschicht
organization:
id: 019fd2b7-f768-7325-b254-280a67b1a995
name: 'Retail Services GmbH'
logo_url: null
average_rating: null
location:
name: 'Steuerberatung Wien'
address: 'Margaretenstraße 90, 1050 Wien'
city: Wien
postal_code: '1050'
lat: 48.1944
lng: 16.3585
distance_km: null
schedule:
start_date: '2026-08-15'
end_date: '2026-09-04'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 16
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 1
filled: 0
available: 1
deadlines:
application: '2026-08-10T16:18:26+00:00'
created_at: '2026-08-05T16:18:28+00:00'
is_saved: false
can_apply: true
rate: null
recommendation:
score: 61.5
reasons:
- 'Passt zu Ihren Qualifikationen'
breakdown:
location: 50
qualifications: 100
category_history: 10
company_rating: 50
reliability: 100
-
job:
id: 019fd2b8-1265-737c-ae21-e5265dc709d8
title: 'Servicekraft Restaurant Mitte'
description: 'Wir suchen motivierte Servicekraft Restaurant Mitte für unser engagiertes Team. Sie unterstützen uns bei der professionellen Gästebetreuung und sorgen für ein unvergessliches Erlebnis. Vorkenntnisse in der Gastronomie sind von Vorteil, aber nicht zwingend erforderlich.'
status: active
is_featured: false
category:
id: 019fd2b7-f371-732c-8cdb-6de13be42891
slug: gastro
name: Gastronomie
name_localized: Gastronomy
icon: utensils
color: null
tags:
- Gastronomy
- Tagschicht
- 'HACCP Kenntnisse von Vorteil'
organization:
id: 019fd2b7-ff32-7117-ab28-06e2d3082002
name: 'Bildungszentrum Mitte'
logo_url: null
average_rating: null
location:
name: 'Brasserie Mitte'
address: 'Schwarzenbergplatz 3, 1010 Wien'
city: Wien
postal_code: '1010'
lat: 48.2082
lng: 16.3739
distance_km: null
schedule:
start_date: '2026-08-10'
end_date: '2026-09-09'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 14.5
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 8
filled: 0
available: 8
deadlines:
application: '2026-08-07T16:18:26+00:00'
created_at: '2026-08-05T16:18:26+00:00'
is_saved: false
can_apply: true
rate: null
recommendation:
score: 60
reasons:
- 'Passt zu Ihren Qualifikationen'
breakdown:
location: 50
qualifications: 100
category_history: 0
company_rating: 50
reliability: 100
-
job:
id: 019fd2b8-1287-7146-a673-6798f3d03acc
title: 'Barkeeper Spätschicht Club'
description: 'Wir suchen motivierte Barkeeper Spätschicht Club für unser engagiertes Team. Sie unterstützen uns bei der professionellen Gästebetreuung und sorgen für ein unvergessliches Erlebnis. Vorkenntnisse in der Gastronomie sind von Vorteil, aber nicht zwingend erforderlich.'
status: active
is_featured: false
category:
id: 019fd2b7-f371-732c-8cdb-6de13be42891
slug: gastro
name: Gastronomie
name_localized: Gastronomy
icon: utensils
color: null
tags:
- Gastronomy
- Nachtschicht
- 'HACCP Kenntnisse von Vorteil'
organization:
id: 019fd2b7-f5ae-7390-a778-c08c8d56cdc0
name: 'Event Solutions Austria'
logo_url: null
average_rating: null
location:
name: 'Club Passage'
address: 'Babenbergerstraße 9, 1010 Wien'
city: Wien
postal_code: '1070'
lat: 48.2003
lng: 16.3465
distance_km: null
schedule:
start_date: '2026-08-08'
end_date: '2026-11-03'
shift_start_time: '22:00:00'
shift_end_time: '06:00:00'
shift_type: night
shift_type_label: Nachtschicht
duration_hours: 8
compensation:
hourly_rate_gross: 16
supplements:
night_bonus: 15
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 4
filled: 0
available: 4
deadlines:
application: '2026-08-06T16:18:26+00:00'
created_at: '2026-08-05T16:18:26+00:00'
is_saved: false
can_apply: true
rate: null
recommendation:
score: 60
reasons:
- 'Passt zu Ihren Qualifikationen'
breakdown:
location: 50
qualifications: 100
category_history: 0
company_rating: 50
reliability: 100
-
job:
id: 019fd2b8-1298-737e-bbfd-295992feb4db
title: 'Küchenhilfe Großküche'
description: 'Wir suchen motivierte Küchenhilfe Großküche für unser engagiertes Team. Sie unterstützen uns bei der professionellen Gästebetreuung und sorgen für ein unvergessliches Erlebnis. Vorkenntnisse in der Gastronomie sind von Vorteil, aber nicht zwingend erforderlich.'
status: active
is_featured: false
category:
id: 019fd2b7-f371-732c-8cdb-6de13be42891
slug: gastro
name: Gastronomie
name_localized: Gastronomy
icon: utensils
color: null
tags:
- Gastronomy
- Tagschicht
- 'HACCP Kenntnisse von Vorteil'
organization:
id: 019fd2b7-fad7-719c-887a-a0f510bbd31d
name: 'IT Solutions GmbH'
logo_url: null
average_rating: null
location:
name: 'SV Gastronomie Wien'
address: 'Gablenzgasse 11, 1150 Wien'
city: Wien
postal_code: '1150'
lat: 48.196
lng: 16.3268
distance_km: null
schedule:
start_date: '2026-08-12'
end_date: '2026-12-03'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 13.5
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 10
filled: 0
available: 10
deadlines:
application: '2026-08-07T16:18:26+00:00'
created_at: '2026-08-05T16:18:26+00:00'
is_saved: false
can_apply: true
rate: null
recommendation:
score: 60
reasons:
- 'Passt zu Ihren Qualifikationen'
breakdown:
location: 50
qualifications: 100
category_history: 0
company_rating: 50
reliability: 100
-
job:
id: 019fd2b8-12b2-72ff-8be7-dadbf8e167b6
title: 'Kellner*in Haubenrestaurant'
description: 'Wir suchen motivierte Kellner*in Haubenrestaurant für unser engagiertes Team. Sie unterstützen uns bei der professionellen Gästebetreuung und sorgen für ein unvergessliches Erlebnis. Vorkenntnisse in der Gastronomie sind von Vorteil, aber nicht zwingend erforderlich.'
status: active
is_featured: false
category:
id: 019fd2b7-f371-732c-8cdb-6de13be42891
slug: gastro
name: Gastronomie
name_localized: Gastronomy
icon: utensils
color: null
tags:
- Gastronomy
- Tagschicht
- 'HACCP Kenntnisse von Vorteil'
organization:
id: 019fd2b7-fca6-71cf-8683-c97f6f50a24a
name: 'Reinigungsservice Alpin'
logo_url: null
average_rating: null
location:
name: 'Restaurant Steirereck'
address: 'Am Heumarkt 2a, 1030 Wien'
city: Wien
postal_code: '1030'
lat: 48.2014
lng: 16.387
distance_km: null
schedule:
start_date: '2026-08-15'
end_date: '2026-10-04'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 15.5
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 3
filled: 0
available: 3
deadlines:
application: '2026-08-10T16:18:26+00:00'
created_at: '2026-08-05T16:18:26+00:00'
is_saved: false
can_apply: true
rate: null
recommendation:
score: 60
reasons:
- 'Passt zu Ihren Qualifikationen'
breakdown:
location: 50
qualifications: 100
category_history: 0
company_rating: 50
reliability: 100
-
job:
id: 019fd2b8-12c7-72ab-bd18-53060b989f57
title: 'Buffetkraft Messe'
description: 'Wir suchen motivierte Buffetkraft Messe für unser engagiertes Team. Sie unterstützen uns bei der professionellen Gästebetreuung und sorgen für ein unvergessliches Erlebnis. Vorkenntnisse in der Gastronomie sind von Vorteil, aber nicht zwingend erforderlich.'
status: active
is_featured: false
category:
id: 019fd2b7-f371-732c-8cdb-6de13be42891
slug: gastro
name: Gastronomie
name_localized: Gastronomy
icon: utensils
color: null
tags:
- Gastronomy
- Tagschicht
- 'HACCP Kenntnisse von Vorteil'
organization:
id: 019fd2b7-fe56-70d1-bb3a-641339ce636a
name: 'Lagerhaus Steiermark'
logo_url: null
average_rating: null
location:
name: 'Reed Messe Wien'
address: 'Messeplatz 1, 1021 Wien'
city: Wien
postal_code: '1020'
lat: 48.2176
lng: 16.4138
distance_km: null
schedule:
start_date: '2026-08-19'
end_date: '2026-08-21'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
shift_type: day
shift_type_label: Tagschicht
duration_hours: 8
compensation:
hourly_rate_gross: 13.8
supplements:
weekend_bonus: 8
estimated_total_gross: null
currency: EUR
vacancies:
total: 15
filled: 0
available: 15
deadlines:
application: '2026-08-15T16:18:26+00:00'
created_at: '2026-08-05T16:18:26+00:00'
is_saved: false
can_apply: true
rate: null
recommendation:
score: 60
reasons:
- 'Passt zu Ihren Qualifikationen'
breakdown:
location: 50
qualifications: 100
category_history: 0
company_rating: 50
reliability: 100
tags:
- 'Mobile API'
/api/v1/mobile/auth/confirm-password:
post:
summary: 'Confirm Password'
operationId: confirmPassword
description: "Verifies the authenticated user's current password. Throttled to\nresist brute-force guessing."
parameters: []
responses:
422:
description: 'Wrong Password'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- UNPROCESSABLE_ENTITY
message:
type: string
examples:
- 'The given data was invalid.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type: string
examples:
- password
message:
type: string
examples:
- 'The provided password does not match our records.'
examples:
-
-
field: password
message: 'The provided password does not match our records.'
meta:
type: object
properties: { }
examples:
-
status: UNPROCESSABLE_ENTITY
message: 'The given data was invalid.'
data: null
errors:
-
field: password
message: 'The provided password does not match our records.'
meta: { }
tags:
- 'Mobile API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
password:
type: string
description: ''
examples:
- S3cure-Passw0rd!
required:
- password
/api/v1/mobile/employee-profile/completion:
get:
summary: 'Get Profile Completion'
operationId: getProfileCompletion
description: "What the onboarding UI should drive off: an overall percentage plus the\nstate of each section, so the app can show exactly what is outstanding\nrather than guessing from the profile payload.\n\nA profile is complete only when every required section is — personal,\naddress, tax, bank and documents. The emergency contact is collected but\nnever required. Once all of them are satisfied and the email is verified,\nthe profile moves itself to `pending_approval` and the framework\nagreement is minted for signing; an admin approval is what finally makes\nit `active`.\n\n`correction_fields` is populated when a reviewer sent the profile back,\nand names the fields they want changed."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- Success
data:
type: object
properties:
completion_percentage:
type: integer
examples:
- 50
sections:
type: array
items:
type: object
properties:
key:
type: string
examples:
- personal
complete:
type: boolean
examples:
- false
missing_fields:
type: array
items:
type: string
examples:
-
- legal_first_name
- legal_last_name
- gender
- citizenship_primary
- residence_status
required:
type: boolean
examples:
- true
examples:
-
-
key: personal
complete: false
missing_fields:
- legal_first_name
- legal_last_name
- gender
- citizenship_primary
- residence_status
required: true
-
key: contact
complete: true
missing_fields: []
required: true
-
key: address
complete: true
missing_fields: []
required: true
-
key: tax
complete: true
missing_fields: []
required: true
-
key: bank
complete: false
missing_fields:
- bank_account
required: true
-
key: documents
complete: false
missing_fields:
- address_proof
- social_insurance
- bank
missing_documents:
-
key: address_proof
label: Meldezettel
accepts:
- proof_of_address
-
key: social_insurance
label: 'e-card (Sozialversicherung)'
accepts:
- social_insurance_card
-
key: bank
label: Kontoauszug
accepts:
- bank_statement
required: true
-
key: emergency
complete: false
missing_fields:
- emergency_contact_name
- emergency_contact_phone
required: false
correction_fields:
type:
- string
- 'null'
examples:
- null
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- d4f66e1d-1c44-4c19-94d8-3bc9146f913f
timestamp:
type: string
examples:
- '2026-08-05T16:18:35.700301Z'
examples:
-
status: SUCCESS
message: Success
data:
completion_percentage: 50
sections:
-
key: personal
complete: false
missing_fields:
- legal_first_name
- legal_last_name
- gender
- citizenship_primary
- residence_status
required: true
-
key: contact
complete: true
missing_fields: []
required: true
-
key: address
complete: true
missing_fields: []
required: true
-
key: tax
complete: true
missing_fields: []
required: true
-
key: bank
complete: false
missing_fields:
- bank_account
required: true
-
key: documents
complete: false
missing_fields:
- address_proof
- social_insurance
- bank
missing_documents:
-
key: address_proof
label: Meldezettel
accepts:
- proof_of_address
-
key: social_insurance
label: 'e-card (Sozialversicherung)'
accepts:
- social_insurance_card
-
key: bank
label: Kontoauszug
accepts:
- bank_statement
required: true
-
key: emergency
complete: false
missing_fields:
- emergency_contact_name
- emergency_contact_phone
required: false
correction_fields: null
errors: null
meta:
request_id: d4f66e1d-1c44-4c19-94d8-3bc9146f913f
timestamp: '2026-08-05T16:18:35.700301Z'
tags:
- 'Mobile API'
/api/v1/mobile/employee-profile/personal:
put:
summary: 'Update Personal Details'
operationId: updatePersonalDetails
description: "Identity as it must appear on the employment contract, so the values here\nare matched against the uploaded ID during review — a mismatch sends the\nprofile back for correction rather than failing silently.\n\nEvery field is optional on its own: the section is saved incrementally as\nthe worker fills the wizard, and completion is judged separately by\n`GET /employee-profile/completion`.\n\nSaving this while the profile is `pending_approval`, `rejected` or\n`archived` is refused — a record under review cannot move beneath the\nreviewer."
parameters: []
responses:
422:
description: 'Under 18'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- VALIDATION_ERROR
message:
type: string
examples:
- 'The date of birth must be at least 18 years ago.'
examples:
-
status: VALIDATION_ERROR
message: 'The date of birth must be at least 18 years ago.'
tags:
- 'Mobile API'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
legal_first_name:
type: string
description: 'Given name exactly as on the ID document.'
examples:
- Jonas
legal_last_name:
type: string
description: 'Surname exactly as on the ID document.'
examples:
- Brunner
middle_names:
type: string
description: 'Middle names, if the document shows any.'
examples:
- Maria
previous_last_names:
type: string
description: 'Former surnames, for matching older documents.'
examples:
- Huber
date_of_birth:
type: date
description: 'Must be at least 18 years ago — under-18s cannot be placed.'
examples:
- '1995-04-12'
place_of_birth:
type: string
description: 'Town of birth.'
examples:
- Graz
country_of_birth:
type: string
description: 'Two-letter ISO country code.'
examples:
- AT
gender:
type: string
description: 'M, F or D — or the long form male, female, diverse, not_specified.'
examples:
- M
citizenship_primary:
type: string
description: 'Two-letter ISO code of the main citizenship.'
examples:
- AT
citizenship_additional:
type: array
description: 'Further citizenships, each a two-letter ISO code.'
items:
type: string
examples:
-
- DE
residence_status:
type: string
description: 'Residence basis, which decides whether a work permit is also required. Allowed: AT_CITIZEN, EU_EEA, THIRD_COUNTRY.'
examples:
- AT_CITIZEN
has_driver_license:
type: boolean
description: 'Whether the worker holds a driving licence.'
examples:
- true
has_car:
type: boolean
description: 'Whether the worker has their own vehicle.'
examples:
- false
/api/v1/mobile/employee-profile/contact:
put:
summary: 'Update Contact Details'
operationId: updateContactDetails
description: "Secondary contact details only. The primary email and phone are changed\nthrough `POST /profile/email/request-change` and\n`POST /profile/phone/request-change`, which verify ownership first —\nneither can be overwritten here."
parameters: []
responses: { }
tags:
- 'Mobile API'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
alternate_email:
type: string
description: 'A secondary address, used only if the primary bounces.'
examples:
- jonas.privat@example.com
country_code:
type: string
description: 'Dialling code with leading plus.'
examples:
- '+43'
phone_number:
type: string
description: 'National number without the dialling code.'
examples:
- '6641234567'
/api/v1/mobile/employee-profile/address:
put:
summary: 'Update Address'
operationId: updateAddress
description: "The worker's residential address, which the platform treats as their\nregistered (gemeldete) address — the two are assumed to be the same.\n\nChanging the address invalidates any proof-of-address document already on\nfile: it is set back to `reupload_requested`, and an already-approved\nprofile returns to `pending_approval`. That is deliberate — the old\ndocument no longer evidences where the worker lives."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Profile section updated successfully.'
data:
type: object
properties:
status:
type: string
examples:
- pending_approval
completion_percentage:
type: integer
examples:
- 50
correction_fields:
type:
- string
- 'null'
examples:
- null
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 873b0a88-e989-4e03-b42d-1dbb7f620553
timestamp:
type: string
examples:
- '2026-08-05T16:18:35.741770Z'
examples:
-
status: SUCCESS
message: 'Profile section updated successfully.'
data:
status: pending_approval
completion_percentage: 50
correction_fields: null
errors: null
meta:
request_id: 873b0a88-e989-4e03-b42d-1dbb7f620553
timestamp: '2026-08-05T16:18:35.741770Z'
422:
description: 'Invalid Austrian postal code'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- VALIDATION_ERROR
message:
type: string
examples:
- 'An Austrian postal code must be four digits.'
examples:
-
status: VALIDATION_ERROR
message: 'An Austrian postal code must be four digits.'
tags:
- 'Mobile API'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
address_line_1:
type: string
description: 'Street name.'
examples:
- Hauptstrasse
house_number:
type: string
description: 'House number.'
examples:
- '12'
apartment:
type: string
description: 'Stair/door or apartment.'
examples:
- 'Top 4'
postal_code:
type: string
description: 'Postal code. Austrian codes must be exactly four digits.'
examples:
- '1010'
city:
type: string
description: City.
examples:
- Wien
country:
type: string
description: 'Two-letter ISO country code.'
examples:
- AT
/api/v1/mobile/employee-profile/tax:
put:
summary: 'Update Tax and Social Insurance'
operationId: updateTaxAndSocialInsurance
description: "The Sozialversicherungsnummer is the one field payroll cannot proceed\nwithout: it identifies the worker to the Austrian social insurance system\nand is validated by checksum here, not merely by length.\n\nThree refusals are worth distinguishing, because the app should do\nsomething different for each:\n\n- `VALIDATION_ERROR` (422) — the number is malformed or fails its\n checksum. Ask the worker to correct it.\n- `FIELD_LOCKED` (403) — a number is already on file and the profile has\n been verified. It cannot be changed from the app.\n- `SVS_NUMBER_ALREADY_REGISTERED` (409) — the number is valid and the\n field is not locked, but another profile already holds it. Re-entering\n it cannot help: either the worker already has an account, or the number\n belongs to somebody else. Route them to support with the returned\n `ticket_category`."
parameters: []
responses:
409:
description: 'Number already held by another profile'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SVS_NUMBER_ALREADY_REGISTERED
message:
type: string
examples:
- 'This social-insurance number is already registered.'
data:
type: object
properties:
ticket_category:
type: string
examples:
- profile_change
errors:
type: array
items:
type: object
properties:
field:
type: string
examples:
- svs_number
message:
type: string
examples:
- 'This social-insurance number is already registered.'
examples:
-
-
field: svs_number
message: 'This social-insurance number is already registered.'
examples:
-
status: SVS_NUMBER_ALREADY_REGISTERED
message: 'This social-insurance number is already registered.'
data:
ticket_category: profile_change
errors:
-
field: svs_number
message: 'This social-insurance number is already registered.'
422:
description: 'Checksum failed'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- VALIDATION_ERROR
message:
type: string
examples:
- 'The social insurance number is not valid.'
examples:
-
status: VALIDATION_ERROR
message: 'The social insurance number is not valid.'
tags:
- 'Mobile API'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
svs_number:
type: string
description: 'Ten-digit Sozialversicherungsnummer. The final digits encode the date of birth and the fourth digit is a checksum, both of which are verified.'
examples:
- '1234010195'
tax_number:
type: string
description: 'Finanzamt tax number in the form "12 345/6789".'
examples:
- '12 345/6789'
finanz_online_registered:
type: boolean
description: 'Whether the worker is registered with FinanzOnline.'
examples:
- false
/api/v1/mobile/employee-profile/emergency:
put:
summary: 'Update Emergency Contact'
operationId: updateEmergencyContact
description: "Who to call if something happens on site. Collected for every worker but\nnever required for profile completion, so leaving it empty does not hold\nup approval."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Profile section updated successfully.'
data:
type: object
properties:
status:
type: string
examples:
- active
completion_percentage:
type: integer
examples:
- 50
correction_fields:
type:
- string
- 'null'
examples:
- null
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 6be59063-d244-479e-bd91-343b9cbd343d
timestamp:
type: string
examples:
- '2026-08-05T16:18:35.766541Z'
examples:
-
status: SUCCESS
message: 'Profile section updated successfully.'
data:
status: active
completion_percentage: 50
correction_fields: null
errors: null
meta:
request_id: 6be59063-d244-479e-bd91-343b9cbd343d
timestamp: '2026-08-05T16:18:35.766541Z'
tags:
- 'Mobile API'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
emergency_contact_name:
type: string
description: 'Full name of the contact.'
examples:
- 'Maria Brunner'
emergency_contact_country_code:
type: string
description: 'Dialling code including the plus sign.'
examples:
- '+43'
emergency_contact_phone:
type: string
description: 'Number without the dialling code.'
examples:
- '6641234567'
emergency_contact_relationship:
type: string
description: 'Relationship to the worker.'
examples:
- Schwester
/api/v1/mobile/employee-profile/languages:
get:
summary: 'List Language Skills'
operationId: listLanguageSkills
description: ''
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- Success
data:
type: object
properties:
languages:
type: array
examples:
- []
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 526335a2-9a99-4e27-940a-4d597f30c1f5
timestamp:
type: string
examples:
- '2026-08-05T16:18:35.774502Z'
examples:
-
status: SUCCESS
message: Success
data:
languages: []
errors: null
meta:
request_id: 526335a2-9a99-4e27-940a-4d597f30c1f5
timestamp: '2026-08-05T16:18:35.774502Z'
tags:
- 'Mobile API'
put:
summary: 'Replace Language Skills'
operationId: replaceLanguageSkills
description: "Sends the complete list — whatever is posted becomes the worker's\nlanguages, so omitting an entry removes it. Jobs that require a language\nare matched against these."
parameters: []
responses:
200:
description: Saved
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
languages:
type: array
items:
type: object
properties:
code:
type: string
examples:
- de
level:
type: string
examples:
- c1
examples:
-
-
code: de
level: c1
-
code: en
level: b2
examples:
-
status: SUCCESS
data:
languages:
-
code: de
level: c1
-
code: en
level: b2
tags:
- 'Mobile API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
languages:
type: array
description: 'The full set, up to 20. Send an empty array to clear them.'
items:
type: object
properties:
code:
type: string
description: 'Language code.'
examples:
- de
level:
type: string
description: 'Proficiency, one of the levels the platform recognises.'
examples:
- c1
required:
- code
- level
examples:
-
- []
required:
- languages
/api/v1/mobile/employee-profile:
get:
summary: 'Get Employee Profile'
operationId: getEmployeeProfile
description: "The worker's full employment record — identity, address, tax, bank and\ndocument state — as opposed to `GET /profile`, which is the user account\nbehind the login."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
user:
type: object
properties:
id:
type: string
examples:
- 019fd2b7-f271-73fd-8268-848be381e136
first_name:
type: string
examples:
- Anna
last_name:
type: string
examples:
- Neuling
email:
type: string
examples:
- pending@demo.flexxr.at
phone:
type: string
examples:
- '+436769876543'
country_code:
type: string
examples:
- '+43'
phone_number:
type: string
examples:
- '6769876543'
email_verified:
type: boolean
examples:
- true
phone_verified:
type: boolean
examples:
- true
pending_phone:
type: string
examples:
- '+436641239876'
profile:
type: object
properties:
id:
type: string
examples:
- 019fd2b7-f279-7142-a68d-0d4563a06070
status:
type: string
examples:
- active
status_label:
type: string
examples:
- Aktiv
completion_percentage:
type: integer
examples:
- 0
svs_number_set:
type: boolean
examples:
- true
tax_id_set:
type: boolean
examples:
- false
tax_number_set:
type: boolean
examples:
- false
nationality:
type: string
examples:
- AT
date_of_birth:
type: string
examples:
- '1995-08-20'
place_of_birth:
type:
- string
- 'null'
examples:
- null
gender:
type:
- string
- 'null'
examples:
- null
legal_first_name:
type:
- string
- 'null'
examples:
- null
legal_last_name:
type:
- string
- 'null'
examples:
- null
middle_names:
type:
- string
- 'null'
examples:
- null
previous_last_names:
type:
- string
- 'null'
examples:
- null
country_of_birth:
type:
- string
- 'null'
examples:
- null
residence_status:
type:
- string
- 'null'
examples:
- null
citizenship_primary:
type:
- string
- 'null'
examples:
- null
citizenship_additional:
type:
- string
- 'null'
examples:
- null
has_driver_license:
type: boolean
examples:
- false
has_car:
type: boolean
examples:
- false
finanz_online_registered:
type: boolean
examples:
- false
alternate_email:
type:
- string
- 'null'
examples:
- null
correction_fields:
type:
- string
- 'null'
examples:
- null
address:
type: object
properties:
line_1:
type: string
examples:
- 'Neugasse 5'
line_2:
type:
- string
- 'null'
examples:
- null
house_number:
type:
- string
- 'null'
examples:
- null
apartment:
type:
- string
- 'null'
examples:
- null
postal_code:
type: string
examples:
- '4020'
city:
type: string
examples:
- Linz
country:
type: string
examples:
- AT
emergency_contact:
type: object
properties:
name:
type:
- string
- 'null'
examples:
- null
country_code:
type:
- string
- 'null'
examples:
- null
phone:
type:
- string
- 'null'
examples:
- null
phone_e164:
type:
- string
- 'null'
examples:
- null
relationship:
type:
- string
- 'null'
examples:
- null
is_eu_citizen:
type: boolean
examples:
- false
requires_work_permit:
type: boolean
examples:
- false
work_permit_expires_at:
type:
- string
- 'null'
examples:
- null
work_permit_expiring_soon:
type: boolean
examples:
- false
work_permit_expired:
type: boolean
examples:
- false
onboarding_completed_at:
type: string
examples:
- '2026-08-05 16:18:32'
rejection_reason:
type:
- string
- 'null'
examples:
- null
suspended_reason:
type:
- string
- 'null'
examples:
- null
suspended_until:
type:
- string
- 'null'
examples:
- null
consents:
type: object
properties:
terms_of_service:
type: object
properties:
accepted:
type: boolean
examples:
- true
version:
type: string
examples:
- '1.0'
document_id:
type:
- string
- 'null'
examples:
- null
accepted_at:
type: string
examples:
- '2026-08-05T16:18:17+00:00'
privacy_policy:
type: object
properties:
accepted:
type: boolean
examples:
- false
version:
type:
- string
- 'null'
examples:
- null
document_id:
type:
- string
- 'null'
examples:
- null
accepted_at:
type:
- string
- 'null'
examples:
- null
data_processing:
type: object
properties:
accepted:
type: boolean
examples:
- false
version:
type:
- string
- 'null'
examples:
- null
document_id:
type:
- string
- 'null'
examples:
- null
accepted_at:
type:
- string
- 'null'
examples:
- null
marketing_email:
type: object
properties:
accepted:
type: boolean
examples:
- false
version:
type:
- string
- 'null'
examples:
- null
document_id:
type:
- string
- 'null'
examples:
- null
accepted_at:
type:
- string
- 'null'
examples:
- null
needs_onboarding:
type: boolean
examples:
- false
can_apply_for_jobs:
type: boolean
examples:
- true
examples:
-
status: SUCCESS
data:
user:
id: 019fd2b7-f271-73fd-8268-848be381e136
first_name: Anna
last_name: Neuling
email: pending@demo.flexxr.at
phone: '+436769876543'
country_code: '+43'
phone_number: '6769876543'
email_verified: true
phone_verified: true
pending_phone: '+436641239876'
profile:
id: 019fd2b7-f279-7142-a68d-0d4563a06070
status: active
status_label: Aktiv
completion_percentage: 0
svs_number_set: true
tax_id_set: false
tax_number_set: false
nationality: AT
date_of_birth: '1995-08-20'
place_of_birth: null
gender: null
legal_first_name: null
legal_last_name: null
middle_names: null
previous_last_names: null
country_of_birth: null
residence_status: null
citizenship_primary: null
citizenship_additional: null
has_driver_license: false
has_car: false
finanz_online_registered: false
alternate_email: null
correction_fields: null
address:
line_1: 'Neugasse 5'
line_2: null
house_number: null
apartment: null
postal_code: '4020'
city: Linz
country: AT
emergency_contact:
name: null
country_code: null
phone: null
phone_e164: null
relationship: null
is_eu_citizen: false
requires_work_permit: false
work_permit_expires_at: null
work_permit_expiring_soon: false
work_permit_expired: false
onboarding_completed_at: '2026-08-05 16:18:32'
rejection_reason: null
suspended_reason: null
suspended_until: null
consents:
terms_of_service:
accepted: true
version: '1.0'
document_id: null
accepted_at: '2026-08-05T16:18:17+00:00'
privacy_policy:
accepted: false
version: null
document_id: null
accepted_at: null
data_processing:
accepted: false
version: null
document_id: null
accepted_at: null
marketing_email:
accepted: false
version: null
document_id: null
accepted_at: null
needs_onboarding: false
can_apply_for_jobs: true
404:
description: 'No profile yet'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- NOT_FOUND
message:
type: string
examples:
- 'Please complete your employee profile.'
examples:
-
status: NOT_FOUND
message: 'Please complete your employee profile.'
tags:
- 'Mobile API'
/api/v1/mobile/qualifications:
get:
summary: 'List My Qualifications'
operationId: listMyQualifications
description: "Each with its verification state and expiry. An expired qualification is\nkept on the record but no longer counts towards a job that requires it."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
qualifications:
type: array
examples:
- []
counts:
type: object
properties:
total:
type: integer
examples:
- 0
verified:
type: integer
examples:
- 0
pending:
type: integer
examples:
- 0
expiring_soon:
type: integer
examples:
- 0
expired:
type: integer
examples:
- 0
examples:
-
status: SUCCESS
data:
qualifications: []
counts:
total: 0
verified: 0
pending: 0
expiring_soon: 0
expired: 0
tags:
- 'Mobile API'
post:
summary: 'Add a Qualification'
operationId: addAQualification
description: "A certificate or licence the worker holds — a Staplerschein, a food\nhygiene certificate, a first-aid course. Jobs can require these, and an\nunverified or expired qualification does not satisfy the requirement.\n\nAttach the supporting scan by uploading it via `POST /documents` first\nand passing the resulting id as `document_id`; a qualification with no\nevidence cannot be verified."
parameters: []
responses:
201:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'The qualification has been added successfully.'
data:
type: object
properties:
qualification:
type: object
properties:
id:
type: string
examples:
- 019fd41b-85f2-713f-88ff-c02f3cca8cb7
name:
type: string
examples:
- Staplerschein
description:
type: string
examples:
- 'Gabelstapler bis 5t'
issuing_organization:
type: string
examples:
- 'WIFI Wien'
credential_id:
type: string
examples:
- ST-2024-8891
issued_at:
type: string
examples:
- '2024-03-01'
expires_at:
type: string
examples:
- '2029-03-01'
is_verified:
type: boolean
examples:
- false
created_at:
type: string
examples:
- '2026-08-05 22:46:41'
examples:
-
status: SUCCESS
message: 'The qualification has been added successfully.'
data:
qualification:
id: 019fd41b-85f2-713f-88ff-c02f3cca8cb7
name: Staplerschein
description: 'Gabelstapler bis 5t'
issuing_organization: 'WIFI Wien'
credential_id: ST-2024-8891
issued_at: '2024-03-01'
expires_at: '2029-03-01'
is_verified: false
created_at: '2026-08-05 22:46:41'
tags:
- 'Mobile API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: 'What the qualification is.'
examples:
- Staplerschein
description:
type: string
description: 'Free text, if the name alone is unclear.'
examples:
- 'Gabelstapler bis 5t'
issuing_organization:
type: string
description: 'Who issued it.'
examples:
- 'WIFI Wien'
credential_id:
type: string
description: 'Certificate or licence number.'
examples:
- ST-2024-8891
document_id:
type: string
description: 'An uploaded document evidencing it.'
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
issued_at:
type: date
description: 'Date of issue; cannot be in the future.'
examples:
- '2024-03-01'
expires_at:
type: date
description: 'Expiry date; must be in the future.'
examples:
- '2029-03-01'
required:
- name
'/api/v1/mobile/qualifications/{qualificationId}':
put:
summary: 'Update a Qualification'
operationId: updateAQualification
description: "Editing a verified qualification returns it to review — the details a\nreviewer checked are no longer the details on file."
parameters: []
responses: { }
tags:
- 'Mobile API'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: ''
examples:
- Beispieltext
description:
type: string
description: ''
examples:
- Beispieltext
issuing_organization:
type: string
description: ''
examples:
- Beispieltext
credential_id:
type: string
description: ''
examples:
- Beispieltext
document_id:
type: string
description: ''
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
issued_at:
type: date
description: ''
examples:
- '2026-09-30'
expires_at:
type: date
description: ''
examples:
- '2026-09-30'
delete:
summary: 'Delete a Qualification'
operationId: deleteAQualification
description: ''
parameters: []
responses: { }
tags:
- 'Mobile API'
parameters:
-
in: path
name: qualificationId
description: ''
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
/api/v1/mobile/bank-accounts:
get:
summary: 'List My Bank Accounts'
operationId: listMyBankAccounts
description: ''
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
bank_accounts:
type: array
examples:
- []
has_primary:
type: boolean
examples:
- false
examples:
-
status: SUCCESS
data:
bank_accounts: []
has_primary: false
tags:
- 'Mobile API'
post:
summary: 'Add a Bank Account'
operationId: addABankAccount
description: "Where wages are paid. A bank account is one of the sections a profile\nneeds before it can be submitted for approval.\n\nThe IBAN is checksum-validated, not merely length-checked, and the BIC is\nderived from the Austrian bank code when it is not supplied."
parameters: []
responses:
422:
description: 'Invalid IBAN'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- VALIDATION_ERROR
message:
type: string
examples:
- 'The IBAN is not valid.'
examples:
-
status: VALIDATION_ERROR
message: 'The IBAN is not valid.'
tags:
- 'Mobile API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
account_holder:
type: string
description: "Name on the account. Payroll may reject a mismatch with the worker's legal name."
examples:
- 'Jonas Brunner'
iban:
type: string
description: 'IBAN, validated by checksum.'
examples:
- AT611904300234573201
bic:
type: string
description: 'BIC/SWIFT. Derived from the IBAN for Austrian banks when omitted.'
examples:
- GIBAATWWXXX
bank_name:
type: string
description: 'Name of the bank.'
examples:
- 'Erste Bank'
is_primary:
type: boolean
description: 'Make this the account wages are sent to.'
examples:
- true
verification_document_id:
type: string
description: 'An uploaded bank statement evidencing the account.'
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
required:
- account_holder
- iban
'/api/v1/mobile/bank-accounts/{accountId}/primary':
post:
summary: 'Set the Primary Bank Account'
operationId: setThePrimaryBankAccount
description: "Chooses which account wages are paid into. Exactly one account is primary\nat a time; promoting one demotes the other."
parameters: []
responses: { }
tags:
- 'Mobile API'
parameters:
-
in: path
name: accountId
description: ''
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
'/api/v1/mobile/bank-accounts/{accountId}':
delete:
summary: 'Delete a Bank Account'
operationId: deleteABankAccount
description: "The primary account cannot be removed while it is the only one on file —\na worker with no account cannot be paid."
parameters: []
responses: { }
tags:
- 'Mobile API'
parameters:
-
in: path
name: accountId
description: ''
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
/api/v1/mobile/auth/biometric/enable:
post:
summary: 'Enable Biometric'
operationId: enableBiometric
description: 'Opt in to biometric login from an already password-authenticated session.'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Biometric login has been enabled on this device.'
data:
type: object
properties:
biometric_token:
type: string
examples:
- 7|JjeW6QZpkQSEcPVxm2mduqTTTLqTnGMKVjO9MfWs2aa6a6ac
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- db4a283c-ee3b-42b8-9998-7e0ab3a0e9a4
timestamp:
type: string
examples:
- '2026-08-05T16:18:36.051090Z'
examples:
-
status: SUCCESS
message: 'Biometric login has been enabled on this device.'
data:
biometric_token: 7|JjeW6QZpkQSEcPVxm2mduqTTTLqTnGMKVjO9MfWs2aa6a6ac
errors: null
meta:
request_id: db4a283c-ee3b-42b8-9998-7e0ab3a0e9a4
timestamp: '2026-08-05T16:18:36.051090Z'
tags:
- 'Mobile API'
/api/v1/mobile/auth/biometric/disable:
post:
summary: 'Disable Biometric'
operationId: disableBiometric
description: "Turn off biometric login and revoke the device's biometric credential."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Biometric login has been disabled.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- e38b6ebe-f8fa-40ae-8a87-8667f88c7582
timestamp:
type: string
examples:
- '2026-08-05T16:18:36.064570Z'
examples:
-
status: SUCCESS
message: 'Biometric login has been disabled.'
data: null
errors: null
meta:
request_id: e38b6ebe-f8fa-40ae-8a87-8667f88c7582
timestamp: '2026-08-05T16:18:36.064570Z'
tags:
- 'Mobile API'
/api/v1/mobile/security/two-factor:
get:
summary: 'Get Two-Factor State'
operationId: getTwoFactorState
description: 'Returns the current 2FA configuration for the authenticated user.'
parameters: []
responses:
200:
description: ''
content:
application/json:
schema:
oneOf:
-
description: '2FA Disabled'
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- Success
data:
type: object
properties:
enabled:
type: boolean
examples:
- false
method:
type:
- string
- 'null'
examples:
- null
confirmed_at:
type:
- string
- 'null'
examples:
- null
recovery_codes_remaining:
type: integer
examples:
- 0
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-06-10T12:00:00.000000Z'
examples:
-
status: SUCCESS
message: Success
data:
enabled: false
method: null
confirmed_at: null
recovery_codes_remaining: 0
errors: null
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-06-10T12:00:00.000000Z'
-
description: 'Recorded from a live call'
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- Success
data:
type: object
properties:
enabled:
type: boolean
examples:
- true
method:
type: string
examples:
- totp
confirmed_at:
type: string
examples:
- '2026-08-05T16:18:32+00:00'
recovery_codes_remaining:
type: integer
examples:
- 2
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 4bb5ce3f-11eb-4ddd-b32e-09a6493765be
timestamp:
type: string
examples:
- '2026-08-05T16:18:36.072911Z'
examples:
-
status: SUCCESS
message: Success
data:
enabled: true
method: totp
confirmed_at: '2026-08-05T16:18:32+00:00'
recovery_codes_remaining: 2
errors: null
meta:
request_id: 4bb5ce3f-11eb-4ddd-b32e-09a6493765be
timestamp: '2026-08-05T16:18:36.072911Z'
tags:
- 'Mobile API'
/api/v1/mobile/security/login-history:
get:
summary: 'List Login History'
operationId: listLoginHistory
description: 'Returns recent login attempts for the authenticated user.'
parameters:
-
in: query
name: limit
description: 'nullable Maximum entries to return (min 1, max 50, default 20).'
required: false
schema:
type: integer
description: 'nullable Maximum entries to return (min 1, max 50, default 20).'
examples:
- 20
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- Success
data:
type: array
examples:
- []
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 0e90e127-69d7-4ef7-9364-6d17d1842b2c
timestamp:
type: string
examples:
- '2026-08-05T16:18:36.080326Z'
examples:
-
status: SUCCESS
message: Success
data: []
errors: null
meta:
request_id: 0e90e127-69d7-4ef7-9364-6d17d1842b2c
timestamp: '2026-08-05T16:18:36.080326Z'
tags:
- 'Mobile API'
/api/v1/mobile/security/recovery-codes/regenerate:
post:
summary: 'Regenerate Recovery Codes'
operationId: regenerateRecoveryCodes
description: "Generates new recovery codes, invalidating all previous ones.\nUser must have 2FA enabled."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'New recovery codes have been generated.'
data:
type: object
properties:
recovery_codes:
type: array
items:
type: string
examples:
-
- HB2T0-PKB9V
- RMEKC-3DIJH
- C3VY7-WKMA1
- DWBQ6-EOGR1
- USUS6-PPZO7
- 6M3U3-5CG0V
- HCSH0-CYUBB
- MSNEO-XIOLK
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 1ed862c5-9edb-4fb3-9167-c4f0a29ed7f5
timestamp:
type: string
examples:
- '2026-08-05T16:18:36.089383Z'
examples:
-
status: SUCCESS
message: 'New recovery codes have been generated.'
data:
recovery_codes:
- HB2T0-PKB9V
- RMEKC-3DIJH
- C3VY7-WKMA1
- DWBQ6-EOGR1
- USUS6-PPZO7
- 6M3U3-5CG0V
- HCSH0-CYUBB
- MSNEO-XIOLK
errors: null
meta:
request_id: 1ed862c5-9edb-4fb3-9167-c4f0a29ed7f5
timestamp: '2026-08-05T16:18:36.089383Z'
400:
description: '2FA Not Enabled'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- BAD_REQUEST
message:
type: string
examples:
- 'Two-factor authentication is not enabled.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type:
- string
- 'null'
examples:
- null
message:
type: string
examples:
- 'Two-factor authentication is not enabled.'
examples:
-
-
field: null
message: 'Two-factor authentication is not enabled.'
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-06-10T12:00:00.000000Z'
examples:
-
status: BAD_REQUEST
message: 'Two-factor authentication is not enabled.'
data: null
errors:
-
field: null
message: 'Two-factor authentication is not enabled.'
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-06-10T12:00:00.000000Z'
tags:
- 'Mobile API'
/api/v1/mobile/settings/notifications:
get:
summary: 'Get Notification Settings'
operationId: getNotificationSettings
description: 'Get user notification settings.'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
global:
type: object
properties:
email_enabled:
type: boolean
examples:
- true
push_enabled:
type: boolean
examples:
- true
sms_enabled:
type: boolean
examples:
- true
marketing_enabled:
type: boolean
examples:
- false
categories:
type: object
properties:
security:
type: array
items:
type: object
properties:
type:
type: string
examples:
- registration_welcome
label:
type: string
examples:
- 'Willkommen bei Flexxr'
description:
type: string
examples:
- 'Willkommensnachricht nach der Registrierung mit Link zur E-Mail-Bestätigung'
can_disable:
type: boolean
examples:
- true
supports_push:
type: boolean
examples:
- true
supports_sms:
type: boolean
examples:
- false
email_enabled:
type: boolean
examples:
- true
push_enabled:
type: boolean
examples:
- true
sms_enabled:
type: boolean
examples:
- false
examples:
-
-
type: registration_welcome
label: 'Willkommen bei Flexxr'
description: 'Willkommensnachricht nach der Registrierung mit Link zur E-Mail-Bestätigung'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: new_device_login
label: 'Anmeldung von neuem Gerät'
description: 'Benachrichtigung wenn sich jemand von einem neuen Gerät anmeldet'
can_disable: false
supports_push: true
supports_sms: true
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: password_changed
label: 'Passwort geändert'
description: 'Benachrichtigung bei Passwortänderung'
can_disable: false
supports_push: true
supports_sms: true
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: two_factor_enabled
label: 'Zwei-Faktor-Authentifizierung aktiviert'
description: 'Benachrichtigung wenn 2FA aktiviert wird'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: two_factor_disabled
label: 'Zwei-Faktor-Authentifizierung deaktiviert'
description: 'Benachrichtigung wenn 2FA deaktiviert wird'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: account_suspended
label: 'Konto gesperrt'
description: 'Benachrichtigung wenn Ihr Konto gesperrt wird'
can_disable: false
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: account_reactivated
label: 'Konto reaktiviert'
description: 'Benachrichtigung wenn Ihr Konto reaktiviert wird'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
profile:
type: array
items:
type: object
properties:
type:
type: string
examples:
- profile_approved
label:
type: string
examples:
- 'Profil genehmigt'
description:
type: string
examples:
- 'Benachrichtigung wenn Ihr Profil genehmigt wird'
can_disable:
type: boolean
examples:
- true
supports_push:
type: boolean
examples:
- true
supports_sms:
type: boolean
examples:
- false
email_enabled:
type: boolean
examples:
- true
push_enabled:
type: boolean
examples:
- true
sms_enabled:
type: boolean
examples:
- false
examples:
-
-
type: profile_approved
label: 'Profil genehmigt'
description: 'Benachrichtigung wenn Ihr Profil genehmigt wird'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: profile_rejected
label: 'Profil abgelehnt'
description: 'Benachrichtigung wenn Ihr Profil abgelehnt wird'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: document_verified
label: 'Dokument verifiziert'
description: 'Benachrichtigung wenn ein Dokument verifiziert wird'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: document_rejected
label: 'Dokument abgelehnt'
description: 'Benachrichtigung wenn ein Dokument abgelehnt wird'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: document_expiring
label: 'Dokument läuft ab'
description: 'Erinnerung wenn ein Dokument bald abläuft'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: correction_required
label: 'Korrektur erforderlich'
description: 'Benachrichtigung wenn Korrekturen erforderlich sind'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: review_taking_longer
label: 'Prüfung dauert länger'
description: 'Benachrichtigung wenn die Profilprüfung länger dauert als erwartet'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: profile_incomplete_reminder
label: 'Profil unvollständig – Erinnerung'
description: 'Erinnerung wenn Ihr Profil seit mehreren Tagen unvollständig ist'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: work_permit_expiring
label: 'Arbeitserlaubnis läuft ab'
description: 'Erinnerung wenn Ihre Arbeitserlaubnis bald abläuft'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: work_permit_expired_suspension
label: 'Konto gesperrt – Arbeitserlaubnis abgelaufen'
description: 'Benachrichtigung wenn Ihr Konto aufgrund einer abgelaufenen Arbeitserlaubnis gesperrt wurde'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: profile_submitted
label: 'Unterlagen werden geprüft'
description: 'Benachrichtigung wenn Ihre Unterlagen zur Prüfung eingereicht wurden'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
jobs:
type: array
items:
type: object
properties:
type:
type: string
examples:
- new_job_match
label:
type: string
examples:
- 'Neuer passender Job'
description:
type: string
examples:
- 'Benachrichtigung über neue passende Jobs'
can_disable:
type: boolean
examples:
- true
supports_push:
type: boolean
examples:
- true
supports_sms:
type: boolean
examples:
- false
email_enabled:
type: boolean
examples:
- true
push_enabled:
type: boolean
examples:
- true
sms_enabled:
type: boolean
examples:
- false
examples:
-
-
type: new_job_match
label: 'Neuer passender Job'
description: 'Benachrichtigung über neue passende Jobs'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: saved_job_deadline
label: 'Bewerbungsfrist endet bald'
description: 'Erinnerung, bevor die Bewerbungsfrist eines gemerkten Jobs endet'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: application_received
label: 'Bewerbung eingegangen'
description: 'Bestätigung über eingegangene Bewerbungen'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: application_accepted
label: 'Bewerbung angenommen'
description: 'Benachrichtigung wenn eine Bewerbung angenommen wird'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: application_rejected
label: 'Bewerbung abgelehnt'
description: 'Benachrichtigung wenn eine Bewerbung abgelehnt wird'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: application_waitlisted
label: 'Auf Warteliste gesetzt'
description: 'Benachrichtigung wenn Sie auf die Warteliste gesetzt werden'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: shift_assigned
label: 'Schicht zugewiesen'
description: 'Benachrichtigung wenn Ihnen eine Schicht zugewiesen wird'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: shift_reminder
label: Schicht-Erinnerung
description: 'Erinnerung vor Schichtbeginn'
can_disable: true
supports_push: true
supports_sms: true
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: shift_cancelled
label: 'Schicht storniert'
description: 'Benachrichtigung wenn eine Schicht storniert wird'
can_disable: true
supports_push: true
supports_sms: true
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: shift_modified
label: 'Schicht geändert'
description: 'Benachrichtigung wenn eine Schicht geändert wird'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: shift_location_changed
label: 'Einsatzort geändert'
description: 'Benachrichtigung wenn der Einsatzort einer Schicht geändert wird'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: shift_extended
label: 'Schicht verlängert'
description: 'Benachrichtigung wenn eine Schicht verlängert wird'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: shift_time_disputed
label: 'Arbeitszeit bestritten'
description: 'Benachrichtigung wenn die erfasste Arbeitszeit bestritten wird'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: no_show_detected
label: 'No-Show erkannt'
description: 'Benachrichtigung wenn ein Mitarbeiter nicht erscheint'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: no_show_recorded
label: 'No-Show vermerkt'
description: 'Mitteilung über vermerkte Abwesenheit'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: emergency_shift_available
label: 'Notfall-Schicht verfügbar'
description: 'Benachrichtigung über kurzfristig verfügbare Schichten'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: emergency_shift_assigned
label: 'Notfall-Schicht zugewiesen'
description: 'Bestätigung einer Notfall-Schichtzuweisung'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: replacement_found
label: 'Ersatz gefunden'
description: 'Benachrichtigung wenn Ersatz gefunden wurde'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
finance:
type: array
items:
type: object
properties:
type:
type: string
examples:
- payslip_available
label:
type: string
examples:
- 'Lohnzettel verfügbar'
description:
type: string
examples:
- 'Benachrichtigung wenn ein neuer Lohnzettel verfügbar ist'
can_disable:
type: boolean
examples:
- true
supports_push:
type: boolean
examples:
- false
supports_sms:
type: boolean
examples:
- false
email_enabled:
type: boolean
examples:
- true
push_enabled:
type: boolean
examples:
- false
sms_enabled:
type: boolean
examples:
- false
examples:
-
-
type: payslip_available
label: 'Lohnzettel verfügbar'
description: 'Benachrichtigung wenn ein neuer Lohnzettel verfügbar ist'
can_disable: true
supports_push: false
supports_sms: false
email_enabled: true
push_enabled: false
sms_enabled: false
-
type: payment_sent
label: 'Zahlung gesendet'
description: 'Benachrichtigung wenn eine Zahlung gesendet wird'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: payment_processing
label: 'Auszahlung in Bearbeitung'
description: 'Benachrichtigung wenn eine Auszahlung in Bearbeitung ist'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: invoice_issued
label: 'Rechnung ausgestellt'
description: 'Benachrichtigung wenn eine Rechnung ausgestellt wird'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: payment_due
label: 'Zahlung fällig'
description: 'Erinnerung wenn eine Zahlung fällig wird'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: payment_overdue
label: 'Zahlung überfällig'
description: 'Benachrichtigung wenn eine Zahlung überfällig ist'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: wallet_topped_up
label: 'Wallet aufgeladen'
description: 'Benachrichtigung wenn Ihr Wallet erfolgreich aufgeladen wurde'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: withdrawal_requested
label: 'Auszahlung angefordert'
description: 'Benachrichtigung wenn eine Auszahlung zur Prüfung eingereicht wurde'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: withdrawal_completed
label: 'Auszahlung abgeschlossen'
description: 'Benachrichtigung wenn eine Auszahlung erfolgreich abgeschlossen wurde'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: withdrawal_failed
label: 'Auszahlung fehlgeschlagen'
description: 'Benachrichtigung wenn eine Auszahlung fehlgeschlagen ist'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: withdrawal_rejected
label: 'Auszahlung abgelehnt'
description: 'Benachrichtigung wenn eine Auszahlung abgelehnt wurde'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: withdrawal_cancelled
label: 'Auszahlung storniert'
description: 'Benachrichtigung wenn eine Auszahlung storniert wurde'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: platform_fee_charged
label: 'Plattformgebühr berechnet'
description: 'Benachrichtigung wenn eine Plattformgebühr berechnet wurde'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: payslip_ready
label: 'Lohnzettel bereit'
description: 'Benachrichtigung wenn der Lohnzettel bereit ist'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: invoice_created
label: 'Rechnung erstellt'
description: 'Benachrichtigung über neue Rechnungen'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
communication:
type: array
items:
type: object
properties:
type:
type: string
examples:
- new_message
label:
type: string
examples:
- 'Neue Nachricht'
description:
type: string
examples:
- 'Benachrichtigung über neue Nachrichten'
can_disable:
type: boolean
examples:
- true
supports_push:
type: boolean
examples:
- true
supports_sms:
type: boolean
examples:
- false
email_enabled:
type: boolean
examples:
- true
push_enabled:
type: boolean
examples:
- true
sms_enabled:
type: boolean
examples:
- false
examples:
-
-
type: new_message
label: 'Neue Nachricht'
description: 'Benachrichtigung über neue Nachrichten'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: new_rating
label: 'Neue Bewertung'
description: 'Benachrichtigung über neue Bewertungen'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: support_ticket_update
label: 'Support-Ticket aktualisiert'
description: 'Aktualisierungen zu Ihren Support-Tickets'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: support_ticket_reply
label: 'Support hat geantwortet'
description: 'Benachrichtigung wenn der Support auf Ihr Ticket antwortet'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: support_ticket_resolved
label: 'Support-Ticket gelöst'
description: 'Benachrichtigung wenn Ihr Support-Ticket gelöst wurde'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
system:
type: array
items:
type: object
properties:
type:
type: string
examples:
- compliance_violation
label:
type: string
examples:
- Compliance-Verstoß
description:
type: string
examples:
- 'Benachrichtigung über Arbeitszeitverstöße'
can_disable:
type: boolean
examples:
- true
supports_push:
type: boolean
examples:
- true
supports_sms:
type: boolean
examples:
- false
email_enabled:
type: boolean
examples:
- true
push_enabled:
type: boolean
examples:
- true
sms_enabled:
type: boolean
examples:
- false
examples:
-
-
type: compliance_violation
label: Compliance-Verstoß
description: 'Benachrichtigung über Arbeitszeitverstöße'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: system_notification
label: System-Benachrichtigung
description: 'Allgemeine System-Benachrichtigungen'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
marketing:
type: array
items:
type: object
properties:
type:
type: string
examples:
- marketing_email
label:
type: string
examples:
- 'Marketing E-Mails'
description:
type: string
examples:
- 'Werbliche E-Mails und Angebote'
can_disable:
type: boolean
examples:
- true
supports_push:
type: boolean
examples:
- true
supports_sms:
type: boolean
examples:
- false
email_enabled:
type: boolean
examples:
- false
push_enabled:
type: boolean
examples:
- false
sms_enabled:
type: boolean
examples:
- false
examples:
-
-
type: marketing_email
label: 'Marketing E-Mails'
description: 'Werbliche E-Mails und Angebote'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: false
push_enabled: false
sms_enabled: false
-
type: marketing_push
label: 'Marketing Push-Nachrichten'
description: 'Werbliche Push-Nachrichten'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: false
push_enabled: false
sms_enabled: false
-
type: newsletter
label: Newsletter
description: 'Regelmäßiger Newsletter mit Neuigkeiten'
can_disable: true
supports_push: false
supports_sms: false
email_enabled: false
push_enabled: false
sms_enabled: false
examples:
-
status: SUCCESS
data:
global:
email_enabled: true
push_enabled: true
sms_enabled: true
marketing_enabled: false
categories:
security:
-
type: registration_welcome
label: 'Willkommen bei Flexxr'
description: 'Willkommensnachricht nach der Registrierung mit Link zur E-Mail-Bestätigung'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: new_device_login
label: 'Anmeldung von neuem Gerät'
description: 'Benachrichtigung wenn sich jemand von einem neuen Gerät anmeldet'
can_disable: false
supports_push: true
supports_sms: true
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: password_changed
label: 'Passwort geändert'
description: 'Benachrichtigung bei Passwortänderung'
can_disable: false
supports_push: true
supports_sms: true
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: two_factor_enabled
label: 'Zwei-Faktor-Authentifizierung aktiviert'
description: 'Benachrichtigung wenn 2FA aktiviert wird'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: two_factor_disabled
label: 'Zwei-Faktor-Authentifizierung deaktiviert'
description: 'Benachrichtigung wenn 2FA deaktiviert wird'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: account_suspended
label: 'Konto gesperrt'
description: 'Benachrichtigung wenn Ihr Konto gesperrt wird'
can_disable: false
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: account_reactivated
label: 'Konto reaktiviert'
description: 'Benachrichtigung wenn Ihr Konto reaktiviert wird'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
profile:
-
type: profile_approved
label: 'Profil genehmigt'
description: 'Benachrichtigung wenn Ihr Profil genehmigt wird'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: profile_rejected
label: 'Profil abgelehnt'
description: 'Benachrichtigung wenn Ihr Profil abgelehnt wird'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: document_verified
label: 'Dokument verifiziert'
description: 'Benachrichtigung wenn ein Dokument verifiziert wird'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: document_rejected
label: 'Dokument abgelehnt'
description: 'Benachrichtigung wenn ein Dokument abgelehnt wird'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: document_expiring
label: 'Dokument läuft ab'
description: 'Erinnerung wenn ein Dokument bald abläuft'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: correction_required
label: 'Korrektur erforderlich'
description: 'Benachrichtigung wenn Korrekturen erforderlich sind'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: review_taking_longer
label: 'Prüfung dauert länger'
description: 'Benachrichtigung wenn die Profilprüfung länger dauert als erwartet'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: profile_incomplete_reminder
label: 'Profil unvollständig – Erinnerung'
description: 'Erinnerung wenn Ihr Profil seit mehreren Tagen unvollständig ist'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: work_permit_expiring
label: 'Arbeitserlaubnis läuft ab'
description: 'Erinnerung wenn Ihre Arbeitserlaubnis bald abläuft'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: work_permit_expired_suspension
label: 'Konto gesperrt – Arbeitserlaubnis abgelaufen'
description: 'Benachrichtigung wenn Ihr Konto aufgrund einer abgelaufenen Arbeitserlaubnis gesperrt wurde'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: profile_submitted
label: 'Unterlagen werden geprüft'
description: 'Benachrichtigung wenn Ihre Unterlagen zur Prüfung eingereicht wurden'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
jobs:
-
type: new_job_match
label: 'Neuer passender Job'
description: 'Benachrichtigung über neue passende Jobs'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: saved_job_deadline
label: 'Bewerbungsfrist endet bald'
description: 'Erinnerung, bevor die Bewerbungsfrist eines gemerkten Jobs endet'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: application_received
label: 'Bewerbung eingegangen'
description: 'Bestätigung über eingegangene Bewerbungen'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: application_accepted
label: 'Bewerbung angenommen'
description: 'Benachrichtigung wenn eine Bewerbung angenommen wird'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: application_rejected
label: 'Bewerbung abgelehnt'
description: 'Benachrichtigung wenn eine Bewerbung abgelehnt wird'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: application_waitlisted
label: 'Auf Warteliste gesetzt'
description: 'Benachrichtigung wenn Sie auf die Warteliste gesetzt werden'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: shift_assigned
label: 'Schicht zugewiesen'
description: 'Benachrichtigung wenn Ihnen eine Schicht zugewiesen wird'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: shift_reminder
label: Schicht-Erinnerung
description: 'Erinnerung vor Schichtbeginn'
can_disable: true
supports_push: true
supports_sms: true
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: shift_cancelled
label: 'Schicht storniert'
description: 'Benachrichtigung wenn eine Schicht storniert wird'
can_disable: true
supports_push: true
supports_sms: true
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: shift_modified
label: 'Schicht geändert'
description: 'Benachrichtigung wenn eine Schicht geändert wird'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: shift_location_changed
label: 'Einsatzort geändert'
description: 'Benachrichtigung wenn der Einsatzort einer Schicht geändert wird'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: shift_extended
label: 'Schicht verlängert'
description: 'Benachrichtigung wenn eine Schicht verlängert wird'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: shift_time_disputed
label: 'Arbeitszeit bestritten'
description: 'Benachrichtigung wenn die erfasste Arbeitszeit bestritten wird'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: no_show_detected
label: 'No-Show erkannt'
description: 'Benachrichtigung wenn ein Mitarbeiter nicht erscheint'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: no_show_recorded
label: 'No-Show vermerkt'
description: 'Mitteilung über vermerkte Abwesenheit'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: emergency_shift_available
label: 'Notfall-Schicht verfügbar'
description: 'Benachrichtigung über kurzfristig verfügbare Schichten'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: emergency_shift_assigned
label: 'Notfall-Schicht zugewiesen'
description: 'Bestätigung einer Notfall-Schichtzuweisung'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: replacement_found
label: 'Ersatz gefunden'
description: 'Benachrichtigung wenn Ersatz gefunden wurde'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
finance:
-
type: payslip_available
label: 'Lohnzettel verfügbar'
description: 'Benachrichtigung wenn ein neuer Lohnzettel verfügbar ist'
can_disable: true
supports_push: false
supports_sms: false
email_enabled: true
push_enabled: false
sms_enabled: false
-
type: payment_sent
label: 'Zahlung gesendet'
description: 'Benachrichtigung wenn eine Zahlung gesendet wird'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: payment_processing
label: 'Auszahlung in Bearbeitung'
description: 'Benachrichtigung wenn eine Auszahlung in Bearbeitung ist'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: invoice_issued
label: 'Rechnung ausgestellt'
description: 'Benachrichtigung wenn eine Rechnung ausgestellt wird'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: payment_due
label: 'Zahlung fällig'
description: 'Erinnerung wenn eine Zahlung fällig wird'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: payment_overdue
label: 'Zahlung überfällig'
description: 'Benachrichtigung wenn eine Zahlung überfällig ist'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: wallet_topped_up
label: 'Wallet aufgeladen'
description: 'Benachrichtigung wenn Ihr Wallet erfolgreich aufgeladen wurde'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: withdrawal_requested
label: 'Auszahlung angefordert'
description: 'Benachrichtigung wenn eine Auszahlung zur Prüfung eingereicht wurde'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: withdrawal_completed
label: 'Auszahlung abgeschlossen'
description: 'Benachrichtigung wenn eine Auszahlung erfolgreich abgeschlossen wurde'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: withdrawal_failed
label: 'Auszahlung fehlgeschlagen'
description: 'Benachrichtigung wenn eine Auszahlung fehlgeschlagen ist'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: withdrawal_rejected
label: 'Auszahlung abgelehnt'
description: 'Benachrichtigung wenn eine Auszahlung abgelehnt wurde'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: withdrawal_cancelled
label: 'Auszahlung storniert'
description: 'Benachrichtigung wenn eine Auszahlung storniert wurde'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: platform_fee_charged
label: 'Plattformgebühr berechnet'
description: 'Benachrichtigung wenn eine Plattformgebühr berechnet wurde'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: payslip_ready
label: 'Lohnzettel bereit'
description: 'Benachrichtigung wenn der Lohnzettel bereit ist'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: invoice_created
label: 'Rechnung erstellt'
description: 'Benachrichtigung über neue Rechnungen'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
communication:
-
type: new_message
label: 'Neue Nachricht'
description: 'Benachrichtigung über neue Nachrichten'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: new_rating
label: 'Neue Bewertung'
description: 'Benachrichtigung über neue Bewertungen'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: support_ticket_update
label: 'Support-Ticket aktualisiert'
description: 'Aktualisierungen zu Ihren Support-Tickets'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: support_ticket_reply
label: 'Support hat geantwortet'
description: 'Benachrichtigung wenn der Support auf Ihr Ticket antwortet'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: support_ticket_resolved
label: 'Support-Ticket gelöst'
description: 'Benachrichtigung wenn Ihr Support-Ticket gelöst wurde'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
system:
-
type: compliance_violation
label: Compliance-Verstoß
description: 'Benachrichtigung über Arbeitszeitverstöße'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
-
type: system_notification
label: System-Benachrichtigung
description: 'Allgemeine System-Benachrichtigungen'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: true
push_enabled: true
sms_enabled: false
marketing:
-
type: marketing_email
label: 'Marketing E-Mails'
description: 'Werbliche E-Mails und Angebote'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: false
push_enabled: false
sms_enabled: false
-
type: marketing_push
label: 'Marketing Push-Nachrichten'
description: 'Werbliche Push-Nachrichten'
can_disable: true
supports_push: true
supports_sms: false
email_enabled: false
push_enabled: false
sms_enabled: false
-
type: newsletter
label: Newsletter
description: 'Regelmäßiger Newsletter mit Neuigkeiten'
can_disable: true
supports_push: false
supports_sms: false
email_enabled: false
push_enabled: false
sms_enabled: false
tags:
- 'Mobile API'
put:
summary: 'Update Notification Setting'
operationId: updateNotificationSetting
description: 'Update user notification settings.'
parameters: []
responses: { }
tags:
- 'Mobile API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
notification_type:
type: string
description: ''
examples:
- architecto
email_enabled:
type: boolean
description: ''
examples:
- true
push_enabled:
type: boolean
description: ''
examples:
- true
sms_enabled:
type: boolean
description: ''
examples:
- false
required:
- notification_type
/api/v1/mobile/settings/notifications/global:
put:
summary: 'Update Global Notification Settings'
operationId: updateGlobalNotificationSettings
description: 'Update global notification settings.'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
email_enabled:
type: boolean
examples:
- false
push_enabled:
type: boolean
examples:
- false
sms_enabled:
type: boolean
examples:
- true
marketing_enabled:
type: boolean
examples:
- true
examples:
-
status: SUCCESS
data:
email_enabled: false
push_enabled: false
sms_enabled: true
marketing_enabled: true
tags:
- 'Mobile API'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
email_enabled:
type: boolean
description: ''
examples:
- true
push_enabled:
type: boolean
description: ''
examples:
- true
sms_enabled:
type: boolean
description: ''
examples:
- false
marketing_enabled:
type: boolean
description: ''
examples:
- true
/api/v1/mobile/settings/app:
get:
summary: 'Get App Settings'
operationId: getAppSettings
description: "Returns user's app settings (language, theme, biometric auth)."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
settings:
type: object
properties:
language:
type: string
examples:
- de
theme:
type: string
examples:
- system
biometric_enabled:
type: boolean
examples:
- false
push_notifications_enabled:
type: boolean
examples:
- true
location_tracking_enabled:
type: boolean
examples:
- false
email_notifications_enabled:
type: boolean
examples:
- true
available_languages:
type: array
items:
type: object
properties:
code:
type: string
examples:
- de
label:
type: string
examples:
- Deutsch
examples:
-
-
code: de
label: Deutsch
-
code: en
label: English
available_themes:
type: array
items:
type: object
properties:
value:
type: string
examples:
- system
label:
type: string
examples:
- System
examples:
-
-
value: system
label: System
-
value: light
label: Hell
-
value: dark
label: Dunkel
examples:
-
status: SUCCESS
data:
settings:
language: de
theme: system
biometric_enabled: false
push_notifications_enabled: true
location_tracking_enabled: false
email_notifications_enabled: true
available_languages:
-
code: de
label: Deutsch
-
code: en
label: English
available_themes:
-
value: system
label: System
-
value: light
label: Hell
-
value: dark
label: Dunkel
tags:
- 'Mobile API'
put:
summary: 'Update App Settings'
operationId: updateAppSettings
description: "Updates user's app settings (language, theme, biometric auth)."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
settings:
type: object
properties:
language:
type: string
examples:
- de
theme:
type: string
examples:
- dark
biometric_enabled:
type: boolean
examples:
- true
push_notifications_enabled:
type: boolean
examples:
- true
location_tracking_enabled:
type: boolean
examples:
- false
email_notifications_enabled:
type: boolean
examples:
- true
message:
type: string
examples:
- settings.updated
examples:
-
status: SUCCESS
data:
settings:
language: de
theme: dark
biometric_enabled: true
push_notifications_enabled: true
location_tracking_enabled: false
email_notifications_enabled: true
message: settings.updated
tags:
- 'Mobile API'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
language:
type: string
description: 'Language code: de, en. Allowed: de, en.'
examples:
- de
theme:
type: string
description: 'Theme: system, light, dark. Allowed: system, light, dark.'
examples:
- dark
biometric_enabled:
type: boolean
description: 'Enable biometric authentication.'
examples:
- true
push_notifications_enabled:
type: boolean
description: 'Enable push notifications.'
examples:
- true
location_tracking_enabled:
type: boolean
description: 'Enable location tracking.'
examples:
- false
email_notifications_enabled:
type: boolean
description: 'Enable email notifications.'
examples:
- true
/api/v1/mobile/gdpr/consent-history:
get:
summary: 'Consent History'
operationId: consentHistory
description: "Returns a paginated list of consent decisions recorded for the authenticated user,\nincluding consents captured during registration."
parameters:
-
in: query
name: per_page
description: 'nullable Results per page (min 1, max 100, default 25).'
required: false
schema:
type: integer
description: 'nullable Results per page (min 1, max 100, default 25).'
examples:
- 25
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- Success
data:
type: array
examples:
- []
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 1e5faf19-0862-4e67-9563-a92fdc0f1f7c
timestamp:
type: string
examples:
- '2026-08-05T16:18:36.169396Z'
total:
type: integer
examples:
- 0
current_page:
type: integer
examples:
- 1
last_page:
type: integer
examples:
- 1
per_page:
type: integer
examples:
- 25
examples:
-
status: SUCCESS
message: Success
data: []
errors: null
meta:
request_id: 1e5faf19-0862-4e67-9563-a92fdc0f1f7c
timestamp: '2026-08-05T16:18:36.169396Z'
total: 0
current_page: 1
last_page: 1
per_page: 25
tags:
- 'Mobile API'
/api/v1/mobile/gdpr/consent:
post:
summary: 'Record Consent'
operationId: recordConsent
description: 'Records a consent decision for a legal document.'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Your consent has been recorded successfully.'
data:
type: object
properties:
consent_type:
type: string
examples:
- privacy_policy
version:
type: string
examples:
- '2026-06-01'
is_granted:
type: boolean
examples:
- true
recorded_at:
type: string
examples:
- '2026-08-05T16:18:36+00:00'
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 2672f5c3-f949-4ea6-87f4-f965aef850be
timestamp:
type: string
examples:
- '2026-08-05T16:18:36.181527Z'
examples:
-
status: SUCCESS
message: 'Your consent has been recorded successfully.'
data:
consent_type: privacy_policy
version: '2026-06-01'
is_granted: true
recorded_at: '2026-08-05T16:18:36+00:00'
errors: null
meta:
request_id: 2672f5c3-f949-4ea6-87f4-f965aef850be
timestamp: '2026-08-05T16:18:36.181527Z'
tags:
- 'Mobile API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
consent_type:
type: string
description: 'Type of consent (privacy_policy, terms_of_service, marketing_email, etc.).'
examples:
- privacy_policy
version:
type: string
description: 'Version of the document being consented to.'
examples:
- '2026-06-01'
is_granted:
type: boolean
description: 'Whether consent is granted or withdrawn.'
examples:
- true
client_timestamp:
type:
- string
- 'null'
description: 'When the device recorded it, for offline captures. Must not be greater than 50 characters.'
examples:
- '2026-07-26T09:00:00Z'
required:
- consent_type
- version
- is_granted
/api/v1/mobile/gdpr/export:
get:
summary: 'Export My Data (Art. 15 DSGVO)'
operationId: exportMyDataArt15DSGVO
description: "Returns all personal data held about the authenticated user.\nRate-limited to once per 5 minutes."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Data export has been generated.'
data:
type: object
properties:
user:
type: object
properties:
id:
type: string
examples:
- 019fd2b7-f271-73fd-8268-848be381e136
first_name:
type: string
examples:
- Anna
last_name:
type: string
examples:
- Neuling
email:
type: string
examples:
- pending@demo.flexxr.at
email_verified_at:
type: string
examples:
- '2026-08-05T16:18:32+00:00'
phone:
type: string
examples:
- '+436769876543'
date_of_birth:
type:
- string
- 'null'
examples:
- null
status:
type: string
examples:
- active
notify_push:
type: boolean
examples:
- true
notify_email:
type: boolean
examples:
- true
notify_sms:
type: boolean
examples:
- true
notify_marketing:
type: boolean
examples:
- false
created_at:
type: string
examples:
- '2026-08-05T16:18:18+00:00'
employee_profile:
type: object
properties:
status:
type: string
examples:
- active
svs_number:
type: string
examples:
- '****0895'
tax_id:
type:
- string
- 'null'
examples:
- null
tax_number:
type:
- string
- 'null'
examples:
- null
nationality:
type: string
examples:
- AT
date_of_birth:
type: string
examples:
- '1995-08-20'
place_of_birth:
type:
- string
- 'null'
examples:
- null
gender:
type:
- string
- 'null'
examples:
- null
legal_first_name:
type:
- string
- 'null'
examples:
- null
legal_last_name:
type:
- string
- 'null'
examples:
- null
middle_names:
type:
- string
- 'null'
examples:
- null
previous_last_names:
type:
- string
- 'null'
examples:
- null
country_of_birth:
type:
- string
- 'null'
examples:
- null
citizenship_primary:
type:
- string
- 'null'
examples:
- null
citizenship_additional:
type:
- string
- 'null'
examples:
- null
residence_status:
type:
- string
- 'null'
examples:
- null
alternate_email:
type:
- string
- 'null'
examples:
- null
address:
type: string
examples:
- 'Neugasse 5'
address_line_2:
type:
- string
- 'null'
examples:
- null
house_number:
type:
- string
- 'null'
examples:
- null
apartment:
type:
- string
- 'null'
examples:
- null
city:
type: string
examples:
- Linz
postal_code:
type: string
examples:
- '4020'
country:
type: string
examples:
- AT
finanz_online_registered:
type: boolean
examples:
- false
is_eu_citizen:
type: boolean
examples:
- false
requires_work_permit:
type: boolean
examples:
- false
work_permit_expires_at:
type:
- string
- 'null'
examples:
- null
onboarding_completed_at:
type: string
examples:
- '2026-08-05T16:18:32+00:00'
documents:
type: array
items:
type: object
properties:
type:
type: string
examples:
- id_card
status:
type: string
examples:
- pending
expires_at:
type:
- string
- 'null'
examples:
- null
uploaded_at:
type: string
examples:
- '2026-08-05T16:18:18+00:00'
examples:
-
-
type: id_card
status: pending
expires_at: null
uploaded_at: '2026-08-05T16:18:18+00:00'
-
type: passport
status: verified
expires_at: '2033-05-22'
uploaded_at: '2026-08-05T16:18:32+00:00'
attachments:
type: array
items:
type: object
properties:
label:
type: string
examples:
- 'voluptas nihil'
original_filename:
type: string
examples:
- est.pdf
file_size:
type: integer
examples:
- 293696
uploaded_at:
type: string
examples:
- '2026-08-05T16:18:32+00:00'
examples:
-
-
label: 'voluptas nihil'
original_filename: est.pdf
file_size: 293696
uploaded_at: '2026-08-05T16:18:32+00:00'
qualifications:
type: array
examples:
- []
bank_accounts:
type: array
examples:
- []
applications:
type: array
items:
type: object
properties:
job_title:
type: string
examples:
- Accountant
status:
type: string
examples:
- selected
applied_at:
type: string
examples:
- '2026-08-05T16:18:32+00:00'
examples:
-
-
job_title: Accountant
status: selected
applied_at: '2026-08-05T16:18:32+00:00'
shifts:
type: array
items:
type: object
properties:
date:
type:
- string
- 'null'
examples:
- null
start_time:
type:
- string
- 'null'
examples:
- null
end_time:
type:
- string
- 'null'
examples:
- null
status:
type: string
examples:
- completed
clock_in_at:
type:
- string
- 'null'
examples:
- null
clock_out_at:
type:
- string
- 'null'
examples:
- null
examples:
-
-
date: null
start_time: null
end_time: null
status: completed
clock_in_at: null
clock_out_at: null
-
date: null
start_time: null
end_time: null
status: awaiting_signature
clock_in_at: null
clock_out_at: null
-
date: null
start_time: null
end_time: null
status: checked_in
clock_in_at: null
clock_out_at: null
-
date: null
start_time: null
end_time: null
status: signed
clock_in_at: null
clock_out_at: null
contracts:
type: array
examples:
- []
ratings_given:
type: array
examples:
- []
ratings_received:
type: array
examples:
- []
consents:
type: array
items:
type: object
properties:
consent_type:
type: string
examples:
- terms_of_service
version:
type: string
examples:
- '1.0'
is_granted:
type: boolean
examples:
- true
recorded_at:
type: string
examples:
- '2026-08-05T16:18:17+00:00'
examples:
-
-
consent_type: terms_of_service
version: '1.0'
is_granted: true
recorded_at: '2026-08-05T16:18:17+00:00'
exported_at:
type: string
examples:
- '2026-08-05T16:18:36+00:00'
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- aa451d65-823a-4848-850b-ff7a4caf66e2
timestamp:
type: string
examples:
- '2026-08-05T16:18:36.201637Z'
examples:
-
status: SUCCESS
message: 'Data export has been generated.'
data:
user:
id: 019fd2b7-f271-73fd-8268-848be381e136
first_name: Anna
last_name: Neuling
email: pending@demo.flexxr.at
email_verified_at: '2026-08-05T16:18:32+00:00'
phone: '+436769876543'
date_of_birth: null
status: active
notify_push: true
notify_email: true
notify_sms: true
notify_marketing: false
created_at: '2026-08-05T16:18:18+00:00'
employee_profile:
status: active
svs_number: '****0895'
tax_id: null
tax_number: null
nationality: AT
date_of_birth: '1995-08-20'
place_of_birth: null
gender: null
legal_first_name: null
legal_last_name: null
middle_names: null
previous_last_names: null
country_of_birth: null
citizenship_primary: null
citizenship_additional: null
residence_status: null
alternate_email: null
address: 'Neugasse 5'
address_line_2: null
house_number: null
apartment: null
city: Linz
postal_code: '4020'
country: AT
finanz_online_registered: false
is_eu_citizen: false
requires_work_permit: false
work_permit_expires_at: null
onboarding_completed_at: '2026-08-05T16:18:32+00:00'
documents:
-
type: id_card
status: pending
expires_at: null
uploaded_at: '2026-08-05T16:18:18+00:00'
-
type: passport
status: verified
expires_at: '2033-05-22'
uploaded_at: '2026-08-05T16:18:32+00:00'
attachments:
-
label: 'voluptas nihil'
original_filename: est.pdf
file_size: 293696
uploaded_at: '2026-08-05T16:18:32+00:00'
qualifications: []
bank_accounts: []
applications:
-
job_title: Accountant
status: selected
applied_at: '2026-08-05T16:18:32+00:00'
shifts:
-
date: null
start_time: null
end_time: null
status: completed
clock_in_at: null
clock_out_at: null
-
date: null
start_time: null
end_time: null
status: awaiting_signature
clock_in_at: null
clock_out_at: null
-
date: null
start_time: null
end_time: null
status: checked_in
clock_in_at: null
clock_out_at: null
-
date: null
start_time: null
end_time: null
status: signed
clock_in_at: null
clock_out_at: null
contracts: []
ratings_given: []
ratings_received: []
consents:
-
consent_type: terms_of_service
version: '1.0'
is_granted: true
recorded_at: '2026-08-05T16:18:17+00:00'
exported_at: '2026-08-05T16:18:36+00:00'
errors: null
meta:
request_id: aa451d65-823a-4848-850b-ff7a4caf66e2
timestamp: '2026-08-05T16:18:36.201637Z'
429:
description: 'Rate Limited'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- TOO_MANY_REQUESTS
message:
type: string
examples:
- 'Please wait before requesting another export.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type:
- string
- 'null'
examples:
- null
message:
type: string
examples:
- 'Please wait 5 minute(s) before requesting another export.'
examples:
-
-
field: null
message: 'Please wait 5 minute(s) before requesting another export.'
meta:
type: object
properties: { }
examples:
-
status: TOO_MANY_REQUESTS
message: 'Please wait before requesting another export.'
data: null
errors:
-
field: null
message: 'Please wait 5 minute(s) before requesting another export.'
meta: { }
tags:
- 'Mobile API'
post:
summary: 'Request Data Export (Art. 20 DSGVO)'
operationId: requestDataExportArt20DSGVO
description: "Queues an asynchronous export of all personal data (JSON + copies of\nuploaded documents) as a ZIP. Poll the returned status URL until the\nexport is ready, then download it within 48 hours."
parameters: []
responses:
202:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- ACCEPTED
message:
type: string
examples:
- 'Data export started. You will be notified once it is ready.'
data:
type: object
properties:
export_id:
type: string
examples:
- 019fd2b8-3830-7193-a147-36d8a971a236
status:
type: string
examples:
- pending
status_url:
type: string
examples:
- 'http://localhost:8001/api/v1/mobile/gdpr/export/019fd2b8-3830-7193-a147-36d8a971a236'
expires_at:
type: string
examples:
- '2026-08-07T16:18:36+00:00'
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 9dc62923-ca91-4a86-a867-3be0ff085aef
timestamp:
type: string
examples:
- '2026-08-05T16:18:36.211284Z'
examples:
-
status: ACCEPTED
message: 'Data export started. You will be notified once it is ready.'
data:
export_id: 019fd2b8-3830-7193-a147-36d8a971a236
status: pending
status_url: 'http://localhost:8001/api/v1/mobile/gdpr/export/019fd2b8-3830-7193-a147-36d8a971a236'
expires_at: '2026-08-07T16:18:36+00:00'
errors: null
meta:
request_id: 9dc62923-ca91-4a86-a867-3be0ff085aef
timestamp: '2026-08-05T16:18:36.211284Z'
tags:
- 'Mobile API'
'/api/v1/mobile/gdpr/export/{export_id}':
get:
summary: 'Get Data Export Status'
operationId: getDataExportStatus
description: ''
parameters: []
responses:
200:
description: Ready
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type:
- string
- 'null'
examples:
- null
data:
type: object
properties:
export_id:
type: string
examples:
- exp-uuid
status:
type: string
examples:
- ready
download_url:
type: string
examples:
- 'https://api.flexxr.at/api/v1/mobile/gdpr/export/exp-uuid/download?signature=...'
expires_at:
type: string
examples:
- '2026-06-18T12:00:00+00:00'
file_size:
type: integer
examples:
- 20480
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties: { }
examples:
-
status: SUCCESS
message: null
data:
export_id: exp-uuid
status: ready
download_url: 'https://api.flexxr.at/api/v1/mobile/gdpr/export/exp-uuid/download?signature=...'
expires_at: '2026-06-18T12:00:00+00:00'
file_size: 20480
errors: null
meta: { }
404:
description: 'Not Found'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- NOT_FOUND
message:
type: string
examples:
- 'Export not found.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type:
- string
- 'null'
examples:
- null
message:
type: string
examples:
- 'Export not found.'
examples:
-
-
field: null
message: 'Export not found.'
meta:
type: object
properties: { }
examples:
-
status: NOT_FOUND
message: 'Export not found.'
data: null
errors:
-
field: null
message: 'Export not found.'
meta: { }
tags:
- 'Mobile API'
parameters:
-
in: path
name: export_id
description: 'The ID of the export.'
required: true
schema:
type: string
examples:
- 019febec-0321-7368-9b4e-d906c6855bac
/api/v1/mobile/gdpr/delete-request:
get:
summary: 'Get Account Deletion Status'
operationId: getAccountDeletionStatus
description: "Returns the scheduled deletion date and cancel window, or null when\nno deletion is pending."
parameters: []
responses:
200:
description: ''
content:
application/json:
schema:
oneOf:
-
description: Pending
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type:
- string
- 'null'
examples:
- null
data:
type: object
properties:
scheduled_at:
type: string
examples:
- '2026-08-09T12:00:00+00:00'
can_cancel_until:
type: string
examples:
- '2026-08-09T12:00:00+00:00'
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties: { }
examples:
-
status: SUCCESS
message: null
data:
scheduled_at: '2026-08-09T12:00:00+00:00'
can_cancel_until: '2026-08-09T12:00:00+00:00'
errors: null
meta: { }
-
description: None
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type:
- string
- 'null'
examples:
- null
data:
type:
- string
- 'null'
examples:
- null
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties: { }
examples:
-
status: SUCCESS
message: null
data: null
errors: null
meta: { }
tags:
- 'Mobile API'
post:
summary: 'Request Account Deletion (Art. 17 DSGVO)'
operationId: requestAccountDeletionArt17DSGVO
description: "Creates a deletion request for the user's account.\nThe account will be scheduled for deletion after a 30-day grace period."
parameters: []
responses:
400:
description: 'Already Requested'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- BAD_REQUEST
message:
type: string
examples:
- 'Account deletion already requested.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type:
- string
- 'null'
examples:
- null
message:
type: string
examples:
- 'Account deletion already requested.'
examples:
-
-
field: null
message: 'Account deletion already requested.'
meta:
type: object
properties: { }
examples:
-
status: BAD_REQUEST
message: 'Account deletion already requested.'
data: null
errors:
-
field: null
message: 'Account deletion already requested.'
meta: { }
tags:
- 'Mobile API'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
reason:
type:
- string
- 'null'
description: 'nullable Optional reason for account deletion.'
examples:
- 'No longer using the service'
delete:
summary: 'Cancel Account Deletion'
operationId: cancelAccountDeletion
description: 'Cancels a pending account deletion request during the grace period.'
parameters: []
responses:
200:
description: Success
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Account deletion cancelled.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-06-10T12:00:00.000000Z'
examples:
-
status: SUCCESS
message: 'Account deletion cancelled.'
data: null
errors: null
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-06-10T12:00:00.000000Z'
400:
description: 'No Request'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- BAD_REQUEST
message:
type: string
examples:
- 'No pending deletion request.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type:
- string
- 'null'
examples:
- null
message:
type: string
examples:
- 'No pending deletion request.'
examples:
-
-
field: null
message: 'No pending deletion request.'
meta:
type: object
properties: { }
examples:
-
status: BAD_REQUEST
message: 'No pending deletion request.'
data: null
errors:
-
field: null
message: 'No pending deletion request.'
meta: { }
tags:
- 'Mobile API'
'/api/v1/mobile/gdpr/requests/{gdprRequest_id}':
delete:
summary: 'Withdraw GDPR Request'
operationId: withdrawGDPRRequest
description: ''
parameters: []
responses:
409:
description: 'Already being handled'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- INVALID_OPERATION
message:
type: string
examples:
- 'Only a pending request can be withdrawn.'
examples:
-
status: INVALID_OPERATION
message: 'Only a pending request can be withdrawn.'
tags:
- 'Mobile API'
parameters:
-
in: path
name: gdprRequest_id
description: 'The ID of the gdprRequest.'
required: true
schema:
type: string
examples:
- 019fe6e4-bbcd-71fd-918b-effe04df4ff9
-
in: path
name: gdprRequest
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
/api/v1/mobile/job-alerts:
get:
summary: 'List Job Alerts'
operationId: listJobAlerts
description: 'Returns all job alerts for the authenticated employee.'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: array
items:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-2e42-73c3-89fd-86a26426e4ba
name:
type: string
examples:
- 'Lager Wien'
category:
type:
- string
- 'null'
examples:
- null
location_city:
type:
- string
- 'null'
examples:
- null
location_state:
type:
- string
- 'null'
examples:
- null
min_hourly_rate:
type:
- string
- 'null'
examples:
- null
max_hourly_rate:
type:
- string
- 'null'
examples:
- null
shift_type:
type:
- string
- 'null'
examples:
- null
max_distance_km:
type:
- string
- 'null'
examples:
- null
keywords:
type:
- string
- 'null'
examples:
- null
is_active:
type: boolean
examples:
- true
notification_frequency:
type: string
examples:
- instant
push_enabled:
type: boolean
examples:
- true
email_enabled:
type: boolean
examples:
- false
last_matched_at:
type:
- string
- 'null'
examples:
- null
total_matches:
type: integer
examples:
- 0
created_at:
type: string
examples:
- '2026-08-05T16:18:33+00:00'
examples:
-
-
id: 019fd2b8-2e42-73c3-89fd-86a26426e4ba
name: 'Lager Wien'
category: null
location_city: null
location_state: null
min_hourly_rate: null
max_hourly_rate: null
shift_type: null
max_distance_km: null
keywords: null
is_active: true
notification_frequency: instant
push_enabled: true
email_enabled: false
last_matched_at: null
total_matches: 0
created_at: '2026-08-05T16:18:33+00:00'
examples:
-
status: SUCCESS
data:
-
id: 019fd2b8-2e42-73c3-89fd-86a26426e4ba
name: 'Lager Wien'
category: null
location_city: null
location_state: null
min_hourly_rate: null
max_hourly_rate: null
shift_type: null
max_distance_km: null
keywords: null
is_active: true
notification_frequency: instant
push_enabled: true
email_enabled: false
last_matched_at: null
total_matches: 0
created_at: '2026-08-05T16:18:33+00:00'
tags:
- 'Mobile API'
post:
summary: 'Create Job Alert'
operationId: createJobAlert
description: "Creates a new job alert for the authenticated employee.\nMaximum 10 active alerts per user."
parameters: []
responses:
201:
description: Created
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties: { }
examples:
-
status: SUCCESS
data: { }
422:
description: 'Too many alerts'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- ERROR
message:
type: string
examples:
- 'Maximum 10 active alerts allowed'
examples:
-
status: ERROR
message: 'Maximum 10 active alerts allowed'
tags:
- 'Mobile API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: 'The alert name.'
examples:
- 'Gastro Jobs Wien'
category_id:
type:
- uuid
- 'null'
description: 'Filter by job category.'
examples:
- 019abcd-1234
location_city:
type:
- string
- 'null'
description: 'Filter by city.'
examples:
- Wien
location_state:
type:
- string
- 'null'
description: 'Filter by Austrian state.'
examples:
- wien
min_hourly_rate:
type:
- number
- 'null'
description: 'Minimum hourly rate.'
examples:
- 14.0
max_hourly_rate:
type:
- number
- 'null'
description: 'Maximum hourly rate.'
examples:
- 25.0
shift_type:
type:
- string
- 'null'
description: 'Shift type filter. Allowed: day, night, weekend, holiday.'
examples:
- day
max_distance_km:
type:
- integer
- 'null'
description: 'Search radius in km.'
examples:
- 25
location_lat:
type:
- number
- 'null'
description: 'Latitude for radius search.'
examples:
- 48.2082
location_lng:
type:
- number
- 'null'
description: 'Longitude for radius search.'
examples:
- 16.3738
keywords:
type: array
description: 'Keywords to match in title/description.'
items:
type: string
examples:
-
- kellner
- service
notification_frequency:
type:
- string
- 'null'
description: 'Notification frequency. Allowed: instant, daily, weekly.'
examples:
- instant
push_enabled:
type:
- boolean
- 'null'
description: 'Enable push notifications.'
examples:
- true
email_enabled:
type:
- boolean
- 'null'
description: 'Enable email notifications.'
examples:
- false
required:
- name
'/api/v1/mobile/job-alerts/{alertId}':
put:
summary: 'Update Job Alert'
operationId: updateJobAlert
description: 'Updates an existing job alert for the authenticated employee.'
parameters: []
responses:
200:
description: Updated
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties: { }
examples:
-
status: SUCCESS
data: { }
404:
description: 'Not found'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- ERROR
message:
type: string
examples:
- 'Job alert not found'
examples:
-
status: ERROR
message: 'Job alert not found'
tags:
- 'Mobile API'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: 'The alert name.'
examples:
- 'Gastro Jobs Wien'
category_id:
type:
- uuid
- 'null'
description: 'Filter by job category.'
examples:
- 019abcd-1234
location_city:
type:
- string
- 'null'
description: 'Filter by city.'
examples:
- Wien
location_state:
type:
- string
- 'null'
description: 'Filter by Austrian state.'
examples:
- wien
min_hourly_rate:
type:
- number
- 'null'
description: 'Minimum hourly rate.'
examples:
- 14.0
max_hourly_rate:
type:
- number
- 'null'
description: 'Maximum hourly rate.'
examples:
- 25.0
shift_type:
type:
- string
- 'null'
description: 'Shift type filter. Allowed: day, night, weekend, holiday.'
examples:
- day
max_distance_km:
type:
- integer
- 'null'
description: 'Search radius in km.'
examples:
- 25
location_lat:
type:
- number
- 'null'
description: 'Latitude for radius search.'
examples:
- 48.2082
location_lng:
type:
- number
- 'null'
description: 'Longitude for radius search.'
examples:
- 16.3738
keywords:
type: array
description: 'Keywords to match in title/description.'
items:
type: string
examples:
-
- kellner
- service
is_active:
type:
- boolean
- 'null'
description: 'Whether the alert is active.'
examples:
- true
notification_frequency:
type:
- string
- 'null'
description: 'Notification frequency. Allowed: instant, daily, weekly.'
examples:
- instant
push_enabled:
type:
- boolean
- 'null'
description: 'Enable push notifications.'
examples:
- true
email_enabled:
type:
- boolean
- 'null'
description: 'Enable email notifications.'
examples:
- false
delete:
summary: 'Delete Job Alert'
operationId: deleteJobAlert
description: 'Deletes a job alert for the authenticated employee.'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Job alert deleted'
examples:
-
status: SUCCESS
message: 'Job alert deleted'
404:
description: 'Not found'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- ERROR
message:
type: string
examples:
- 'Job alert not found'
examples:
-
status: ERROR
message: 'Job alert not found'
tags:
- 'Mobile API'
parameters:
-
in: path
name: alertId
description: 'Optional parameter. uuid required The job alert ID.'
required: true
schema:
type: string
examples:
omitted:
summary: 'When the value is omitted'
value: ''
present:
summary: 'When the value is present'
value: 019abcd-5678
/api/v1/mobile/badges:
get:
summary: 'List Badges'
operationId: listBadges
description: 'List all available badges with their status for the authenticated employee.'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
summary:
type: object
properties:
total_badges:
type: integer
examples:
- 0
earned_badges:
type: integer
examples:
- 0
total_points:
type: integer
examples:
- 0
completion_percent:
type: integer
examples:
- 0
badges:
type: array
examples:
- []
examples:
-
summary:
total_badges: 0
earned_badges: 0
total_points: 0
completion_percent: 0
badges: []
tags:
- 'Mobile API'
/api/v1/mobile/badges/earned:
get:
summary: 'List Earned Badges'
operationId: listEarnedBadges
description: "List the authenticated employee's earned badges."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
total_badges:
type: integer
examples:
- 0
total_points:
type: integer
examples:
- 0
badges:
type: array
examples:
- []
examples:
-
total_badges: 0
total_points: 0
badges: []
tags:
- 'Mobile API'
/api/v1/mobile/earnings:
get:
summary: 'Get Earnings Summary'
operationId: getEarningsSummary
description: "Returns earnings breakdown from completed shifts.\nSupports period filtering (week/month/year/all)."
parameters:
-
in: query
name: period
description: 'Time period: week, month, year, all.'
required: false
schema:
type: string
description: 'Time period: week, month, year, all.'
examples:
- month
-
in: query
name: start_date
description: 'date Custom start date.'
required: false
schema:
type: string
description: 'date Custom start date.'
examples:
- '2026-01-01'
-
in: query
name: end_date
description: 'date Custom end date.'
required: false
schema:
type: string
description: 'date Custom end date.'
examples:
- '2026-06-30'
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
period:
type: object
properties:
type:
type: string
examples:
- month
start:
type: string
examples:
- '2026-01-01'
end:
type: string
examples:
- '2026-06-30'
label:
type: string
examples:
- '01.01.2026 - 30.06.2026'
summary:
type: object
properties:
total_gross:
type: integer
examples:
- 0
total_net_estimated:
type: integer
examples:
- 0
total_hours:
type: integer
examples:
- 0
shifts_count:
type: integer
examples:
- 0
avg_hourly_rate:
type: integer
examples:
- 0
breakdown:
type: object
properties:
paid:
type: object
properties:
amount:
type: integer
examples:
- 0
hours:
type: integer
examples:
- 0
shifts_count:
type: integer
examples:
- 0
pending:
type: object
properties:
amount:
type: integer
examples:
- 0
hours:
type: integer
examples:
- 0
shifts_count:
type: integer
examples:
- 0
by_category:
type: array
examples:
- []
by_organization:
type: array
examples:
- []
chart_data:
type: array
items:
type: object
properties:
date:
type: string
examples:
- '2026-01-01'
label:
type: string
examples:
- '01'
gross:
type: integer
examples:
- 0
hours:
type: integer
examples:
- 0
shifts:
type: integer
examples:
- 0
examples:
-
-
date: '2026-01-01'
label: '01'
gross: 0
hours: 0
shifts: 0
-
date: '2026-01-02'
label: '02'
gross: 0
hours: 0
shifts: 0
-
date: '2026-01-03'
label: '03'
gross: 0
hours: 0
shifts: 0
-
date: '2026-01-04'
label: '04'
gross: 0
hours: 0
shifts: 0
-
date: '2026-01-05'
label: '05'
gross: 0
hours: 0
shifts: 0
-
date: '2026-01-06'
label: '06'
gross: 0
hours: 0
shifts: 0
-
date: '2026-01-07'
label: '07'
gross: 0
hours: 0
shifts: 0
-
date: '2026-01-08'
label: '08'
gross: 0
hours: 0
shifts: 0
-
date: '2026-01-09'
label: '09'
gross: 0
hours: 0
shifts: 0
-
date: '2026-01-10'
label: '10'
gross: 0
hours: 0
shifts: 0
-
date: '2026-01-11'
label: '11'
gross: 0
hours: 0
shifts: 0
-
date: '2026-01-12'
label: '12'
gross: 0
hours: 0
shifts: 0
-
date: '2026-01-13'
label: '13'
gross: 0
hours: 0
shifts: 0
-
date: '2026-01-14'
label: '14'
gross: 0
hours: 0
shifts: 0
-
date: '2026-01-15'
label: '15'
gross: 0
hours: 0
shifts: 0
-
date: '2026-01-16'
label: '16'
gross: 0
hours: 0
shifts: 0
-
date: '2026-01-17'
label: '17'
gross: 0
hours: 0
shifts: 0
-
date: '2026-01-18'
label: '18'
gross: 0
hours: 0
shifts: 0
-
date: '2026-01-19'
label: '19'
gross: 0
hours: 0
shifts: 0
-
date: '2026-01-20'
label: '20'
gross: 0
hours: 0
shifts: 0
-
date: '2026-01-21'
label: '21'
gross: 0
hours: 0
shifts: 0
-
date: '2026-01-22'
label: '22'
gross: 0
hours: 0
shifts: 0
-
date: '2026-01-23'
label: '23'
gross: 0
hours: 0
shifts: 0
-
date: '2026-01-24'
label: '24'
gross: 0
hours: 0
shifts: 0
-
date: '2026-01-25'
label: '25'
gross: 0
hours: 0
shifts: 0
-
date: '2026-01-26'
label: '26'
gross: 0
hours: 0
shifts: 0
-
date: '2026-01-27'
label: '27'
gross: 0
hours: 0
shifts: 0
-
date: '2026-01-28'
label: '28'
gross: 0
hours: 0
shifts: 0
-
date: '2026-01-29'
label: '29'
gross: 0
hours: 0
shifts: 0
-
date: '2026-01-30'
label: '30'
gross: 0
hours: 0
shifts: 0
-
date: '2026-01-31'
label: '31'
gross: 0
hours: 0
shifts: 0
-
date: '2026-02-01'
label: '01'
gross: 0
hours: 0
shifts: 0
-
date: '2026-02-02'
label: '02'
gross: 0
hours: 0
shifts: 0
-
date: '2026-02-03'
label: '03'
gross: 0
hours: 0
shifts: 0
-
date: '2026-02-04'
label: '04'
gross: 0
hours: 0
shifts: 0
-
date: '2026-02-05'
label: '05'
gross: 0
hours: 0
shifts: 0
-
date: '2026-02-06'
label: '06'
gross: 0
hours: 0
shifts: 0
-
date: '2026-02-07'
label: '07'
gross: 0
hours: 0
shifts: 0
-
date: '2026-02-08'
label: '08'
gross: 0
hours: 0
shifts: 0
-
date: '2026-02-09'
label: '09'
gross: 0
hours: 0
shifts: 0
-
date: '2026-02-10'
label: '10'
gross: 0
hours: 0
shifts: 0
-
date: '2026-02-11'
label: '11'
gross: 0
hours: 0
shifts: 0
-
date: '2026-02-12'
label: '12'
gross: 0
hours: 0
shifts: 0
-
date: '2026-02-13'
label: '13'
gross: 0
hours: 0
shifts: 0
-
date: '2026-02-14'
label: '14'
gross: 0
hours: 0
shifts: 0
-
date: '2026-02-15'
label: '15'
gross: 0
hours: 0
shifts: 0
-
date: '2026-02-16'
label: '16'
gross: 0
hours: 0
shifts: 0
-
date: '2026-02-17'
label: '17'
gross: 0
hours: 0
shifts: 0
-
date: '2026-02-18'
label: '18'
gross: 0
hours: 0
shifts: 0
-
date: '2026-02-19'
label: '19'
gross: 0
hours: 0
shifts: 0
-
date: '2026-02-20'
label: '20'
gross: 0
hours: 0
shifts: 0
-
date: '2026-02-21'
label: '21'
gross: 0
hours: 0
shifts: 0
-
date: '2026-02-22'
label: '22'
gross: 0
hours: 0
shifts: 0
-
date: '2026-02-23'
label: '23'
gross: 0
hours: 0
shifts: 0
-
date: '2026-02-24'
label: '24'
gross: 0
hours: 0
shifts: 0
-
date: '2026-02-25'
label: '25'
gross: 0
hours: 0
shifts: 0
-
date: '2026-02-26'
label: '26'
gross: 0
hours: 0
shifts: 0
-
date: '2026-02-27'
label: '27'
gross: 0
hours: 0
shifts: 0
-
date: '2026-02-28'
label: '28'
gross: 0
hours: 0
shifts: 0
-
date: '2026-03-01'
label: '01'
gross: 0
hours: 0
shifts: 0
-
date: '2026-03-02'
label: '02'
gross: 0
hours: 0
shifts: 0
-
date: '2026-03-03'
label: '03'
gross: 0
hours: 0
shifts: 0
-
date: '2026-03-04'
label: '04'
gross: 0
hours: 0
shifts: 0
-
date: '2026-03-05'
label: '05'
gross: 0
hours: 0
shifts: 0
-
date: '2026-03-06'
label: '06'
gross: 0
hours: 0
shifts: 0
-
date: '2026-03-07'
label: '07'
gross: 0
hours: 0
shifts: 0
-
date: '2026-03-08'
label: '08'
gross: 0
hours: 0
shifts: 0
-
date: '2026-03-09'
label: '09'
gross: 0
hours: 0
shifts: 0
-
date: '2026-03-10'
label: '10'
gross: 0
hours: 0
shifts: 0
-
date: '2026-03-11'
label: '11'
gross: 0
hours: 0
shifts: 0
-
date: '2026-03-12'
label: '12'
gross: 0
hours: 0
shifts: 0
-
date: '2026-03-13'
label: '13'
gross: 0
hours: 0
shifts: 0
-
date: '2026-03-14'
label: '14'
gross: 0
hours: 0
shifts: 0
-
date: '2026-03-15'
label: '15'
gross: 0
hours: 0
shifts: 0
-
date: '2026-03-16'
label: '16'
gross: 0
hours: 0
shifts: 0
-
date: '2026-03-17'
label: '17'
gross: 0
hours: 0
shifts: 0
-
date: '2026-03-18'
label: '18'
gross: 0
hours: 0
shifts: 0
-
date: '2026-03-19'
label: '19'
gross: 0
hours: 0
shifts: 0
-
date: '2026-03-20'
label: '20'
gross: 0
hours: 0
shifts: 0
-
date: '2026-03-21'
label: '21'
gross: 0
hours: 0
shifts: 0
-
date: '2026-03-22'
label: '22'
gross: 0
hours: 0
shifts: 0
-
date: '2026-03-23'
label: '23'
gross: 0
hours: 0
shifts: 0
-
date: '2026-03-24'
label: '24'
gross: 0
hours: 0
shifts: 0
-
date: '2026-03-25'
label: '25'
gross: 0
hours: 0
shifts: 0
-
date: '2026-03-26'
label: '26'
gross: 0
hours: 0
shifts: 0
-
date: '2026-03-27'
label: '27'
gross: 0
hours: 0
shifts: 0
-
date: '2026-03-28'
label: '28'
gross: 0
hours: 0
shifts: 0
-
date: '2026-03-29'
label: '29'
gross: 0
hours: 0
shifts: 0
-
date: '2026-03-30'
label: '30'
gross: 0
hours: 0
shifts: 0
-
date: '2026-03-31'
label: '31'
gross: 0
hours: 0
shifts: 0
-
date: '2026-04-01'
label: '01'
gross: 0
hours: 0
shifts: 0
-
date: '2026-04-02'
label: '02'
gross: 0
hours: 0
shifts: 0
-
date: '2026-04-03'
label: '03'
gross: 0
hours: 0
shifts: 0
-
date: '2026-04-04'
label: '04'
gross: 0
hours: 0
shifts: 0
-
date: '2026-04-05'
label: '05'
gross: 0
hours: 0
shifts: 0
-
date: '2026-04-06'
label: '06'
gross: 0
hours: 0
shifts: 0
-
date: '2026-04-07'
label: '07'
gross: 0
hours: 0
shifts: 0
-
date: '2026-04-08'
label: '08'
gross: 0
hours: 0
shifts: 0
-
date: '2026-04-09'
label: '09'
gross: 0
hours: 0
shifts: 0
-
date: '2026-04-10'
label: '10'
gross: 0
hours: 0
shifts: 0
-
date: '2026-04-11'
label: '11'
gross: 0
hours: 0
shifts: 0
-
date: '2026-04-12'
label: '12'
gross: 0
hours: 0
shifts: 0
-
date: '2026-04-13'
label: '13'
gross: 0
hours: 0
shifts: 0
-
date: '2026-04-14'
label: '14'
gross: 0
hours: 0
shifts: 0
-
date: '2026-04-15'
label: '15'
gross: 0
hours: 0
shifts: 0
-
date: '2026-04-16'
label: '16'
gross: 0
hours: 0
shifts: 0
-
date: '2026-04-17'
label: '17'
gross: 0
hours: 0
shifts: 0
-
date: '2026-04-18'
label: '18'
gross: 0
hours: 0
shifts: 0
-
date: '2026-04-19'
label: '19'
gross: 0
hours: 0
shifts: 0
-
date: '2026-04-20'
label: '20'
gross: 0
hours: 0
shifts: 0
-
date: '2026-04-21'
label: '21'
gross: 0
hours: 0
shifts: 0
-
date: '2026-04-22'
label: '22'
gross: 0
hours: 0
shifts: 0
-
date: '2026-04-23'
label: '23'
gross: 0
hours: 0
shifts: 0
-
date: '2026-04-24'
label: '24'
gross: 0
hours: 0
shifts: 0
-
date: '2026-04-25'
label: '25'
gross: 0
hours: 0
shifts: 0
-
date: '2026-04-26'
label: '26'
gross: 0
hours: 0
shifts: 0
-
date: '2026-04-27'
label: '27'
gross: 0
hours: 0
shifts: 0
-
date: '2026-04-28'
label: '28'
gross: 0
hours: 0
shifts: 0
-
date: '2026-04-29'
label: '29'
gross: 0
hours: 0
shifts: 0
-
date: '2026-04-30'
label: '30'
gross: 0
hours: 0
shifts: 0
-
date: '2026-05-01'
label: '01'
gross: 0
hours: 0
shifts: 0
-
date: '2026-05-02'
label: '02'
gross: 0
hours: 0
shifts: 0
-
date: '2026-05-03'
label: '03'
gross: 0
hours: 0
shifts: 0
-
date: '2026-05-04'
label: '04'
gross: 0
hours: 0
shifts: 0
-
date: '2026-05-05'
label: '05'
gross: 0
hours: 0
shifts: 0
-
date: '2026-05-06'
label: '06'
gross: 0
hours: 0
shifts: 0
-
date: '2026-05-07'
label: '07'
gross: 0
hours: 0
shifts: 0
-
date: '2026-05-08'
label: '08'
gross: 0
hours: 0
shifts: 0
-
date: '2026-05-09'
label: '09'
gross: 0
hours: 0
shifts: 0
-
date: '2026-05-10'
label: '10'
gross: 0
hours: 0
shifts: 0
-
date: '2026-05-11'
label: '11'
gross: 0
hours: 0
shifts: 0
-
date: '2026-05-12'
label: '12'
gross: 0
hours: 0
shifts: 0
-
date: '2026-05-13'
label: '13'
gross: 0
hours: 0
shifts: 0
-
date: '2026-05-14'
label: '14'
gross: 0
hours: 0
shifts: 0
-
date: '2026-05-15'
label: '15'
gross: 0
hours: 0
shifts: 0
-
date: '2026-05-16'
label: '16'
gross: 0
hours: 0
shifts: 0
-
date: '2026-05-17'
label: '17'
gross: 0
hours: 0
shifts: 0
-
date: '2026-05-18'
label: '18'
gross: 0
hours: 0
shifts: 0
-
date: '2026-05-19'
label: '19'
gross: 0
hours: 0
shifts: 0
-
date: '2026-05-20'
label: '20'
gross: 0
hours: 0
shifts: 0
-
date: '2026-05-21'
label: '21'
gross: 0
hours: 0
shifts: 0
-
date: '2026-05-22'
label: '22'
gross: 0
hours: 0
shifts: 0
-
date: '2026-05-23'
label: '23'
gross: 0
hours: 0
shifts: 0
-
date: '2026-05-24'
label: '24'
gross: 0
hours: 0
shifts: 0
-
date: '2026-05-25'
label: '25'
gross: 0
hours: 0
shifts: 0
-
date: '2026-05-26'
label: '26'
gross: 0
hours: 0
shifts: 0
-
date: '2026-05-27'
label: '27'
gross: 0
hours: 0
shifts: 0
-
date: '2026-05-28'
label: '28'
gross: 0
hours: 0
shifts: 0
-
date: '2026-05-29'
label: '29'
gross: 0
hours: 0
shifts: 0
-
date: '2026-05-30'
label: '30'
gross: 0
hours: 0
shifts: 0
-
date: '2026-05-31'
label: '31'
gross: 0
hours: 0
shifts: 0
-
date: '2026-06-01'
label: '01'
gross: 0
hours: 0
shifts: 0
-
date: '2026-06-02'
label: '02'
gross: 0
hours: 0
shifts: 0
-
date: '2026-06-03'
label: '03'
gross: 0
hours: 0
shifts: 0
-
date: '2026-06-04'
label: '04'
gross: 0
hours: 0
shifts: 0
-
date: '2026-06-05'
label: '05'
gross: 0
hours: 0
shifts: 0
-
date: '2026-06-06'
label: '06'
gross: 0
hours: 0
shifts: 0
-
date: '2026-06-07'
label: '07'
gross: 0
hours: 0
shifts: 0
-
date: '2026-06-08'
label: '08'
gross: 0
hours: 0
shifts: 0
-
date: '2026-06-09'
label: '09'
gross: 0
hours: 0
shifts: 0
-
date: '2026-06-10'
label: '10'
gross: 0
hours: 0
shifts: 0
-
date: '2026-06-11'
label: '11'
gross: 0
hours: 0
shifts: 0
-
date: '2026-06-12'
label: '12'
gross: 0
hours: 0
shifts: 0
-
date: '2026-06-13'
label: '13'
gross: 0
hours: 0
shifts: 0
-
date: '2026-06-14'
label: '14'
gross: 0
hours: 0
shifts: 0
-
date: '2026-06-15'
label: '15'
gross: 0
hours: 0
shifts: 0
-
date: '2026-06-16'
label: '16'
gross: 0
hours: 0
shifts: 0
-
date: '2026-06-17'
label: '17'
gross: 0
hours: 0
shifts: 0
-
date: '2026-06-18'
label: '18'
gross: 0
hours: 0
shifts: 0
-
date: '2026-06-19'
label: '19'
gross: 0
hours: 0
shifts: 0
-
date: '2026-06-20'
label: '20'
gross: 0
hours: 0
shifts: 0
-
date: '2026-06-21'
label: '21'
gross: 0
hours: 0
shifts: 0
-
date: '2026-06-22'
label: '22'
gross: 0
hours: 0
shifts: 0
-
date: '2026-06-23'
label: '23'
gross: 0
hours: 0
shifts: 0
-
date: '2026-06-24'
label: '24'
gross: 0
hours: 0
shifts: 0
-
date: '2026-06-25'
label: '25'
gross: 0
hours: 0
shifts: 0
-
date: '2026-06-26'
label: '26'
gross: 0
hours: 0
shifts: 0
-
date: '2026-06-27'
label: '27'
gross: 0
hours: 0
shifts: 0
-
date: '2026-06-28'
label: '28'
gross: 0
hours: 0
shifts: 0
-
date: '2026-06-29'
label: '29'
gross: 0
hours: 0
shifts: 0
-
date: '2026-06-30'
label: '30'
gross: 0
hours: 0
shifts: 0
navigation:
type: object
properties:
prev:
type: string
examples:
- 2025-12
next:
type: string
examples:
- 2026-02
examples:
-
status: SUCCESS
data:
period:
type: month
start: '2026-01-01'
end: '2026-06-30'
label: '01.01.2026 - 30.06.2026'
summary:
total_gross: 0
total_net_estimated: 0
total_hours: 0
shifts_count: 0
avg_hourly_rate: 0
breakdown:
paid:
amount: 0
hours: 0
shifts_count: 0
pending:
amount: 0
hours: 0
shifts_count: 0
by_category: []
by_organization: []
chart_data:
-
date: '2026-01-01'
label: '01'
gross: 0
hours: 0
shifts: 0
-
date: '2026-01-02'
label: '02'
gross: 0
hours: 0
shifts: 0
-
date: '2026-01-03'
label: '03'
gross: 0
hours: 0
shifts: 0
-
date: '2026-01-04'
label: '04'
gross: 0
hours: 0
shifts: 0
-
date: '2026-01-05'
label: '05'
gross: 0
hours: 0
shifts: 0
-
date: '2026-01-06'
label: '06'
gross: 0
hours: 0
shifts: 0
-
date: '2026-01-07'
label: '07'
gross: 0
hours: 0
shifts: 0
-
date: '2026-01-08'
label: '08'
gross: 0
hours: 0
shifts: 0
-
date: '2026-01-09'
label: '09'
gross: 0
hours: 0
shifts: 0
-
date: '2026-01-10'
label: '10'
gross: 0
hours: 0
shifts: 0
-
date: '2026-01-11'
label: '11'
gross: 0
hours: 0
shifts: 0
-
date: '2026-01-12'
label: '12'
gross: 0
hours: 0
shifts: 0
-
date: '2026-01-13'
label: '13'
gross: 0
hours: 0
shifts: 0
-
date: '2026-01-14'
label: '14'
gross: 0
hours: 0
shifts: 0
-
date: '2026-01-15'
label: '15'
gross: 0
hours: 0
shifts: 0
-
date: '2026-01-16'
label: '16'
gross: 0
hours: 0
shifts: 0
-
date: '2026-01-17'
label: '17'
gross: 0
hours: 0
shifts: 0
-
date: '2026-01-18'
label: '18'
gross: 0
hours: 0
shifts: 0
-
date: '2026-01-19'
label: '19'
gross: 0
hours: 0
shifts: 0
-
date: '2026-01-20'
label: '20'
gross: 0
hours: 0
shifts: 0
-
date: '2026-01-21'
label: '21'
gross: 0
hours: 0
shifts: 0
-
date: '2026-01-22'
label: '22'
gross: 0
hours: 0
shifts: 0
-
date: '2026-01-23'
label: '23'
gross: 0
hours: 0
shifts: 0
-
date: '2026-01-24'
label: '24'
gross: 0
hours: 0
shifts: 0
-
date: '2026-01-25'
label: '25'
gross: 0
hours: 0
shifts: 0
-
date: '2026-01-26'
label: '26'
gross: 0
hours: 0
shifts: 0
-
date: '2026-01-27'
label: '27'
gross: 0
hours: 0
shifts: 0
-
date: '2026-01-28'
label: '28'
gross: 0
hours: 0
shifts: 0
-
date: '2026-01-29'
label: '29'
gross: 0
hours: 0
shifts: 0
-
date: '2026-01-30'
label: '30'
gross: 0
hours: 0
shifts: 0
-
date: '2026-01-31'
label: '31'
gross: 0
hours: 0
shifts: 0
-
date: '2026-02-01'
label: '01'
gross: 0
hours: 0
shifts: 0
-
date: '2026-02-02'
label: '02'
gross: 0
hours: 0
shifts: 0
-
date: '2026-02-03'
label: '03'
gross: 0
hours: 0
shifts: 0
-
date: '2026-02-04'
label: '04'
gross: 0
hours: 0
shifts: 0
-
date: '2026-02-05'
label: '05'
gross: 0
hours: 0
shifts: 0
-
date: '2026-02-06'
label: '06'
gross: 0
hours: 0
shifts: 0
-
date: '2026-02-07'
label: '07'
gross: 0
hours: 0
shifts: 0
-
date: '2026-02-08'
label: '08'
gross: 0
hours: 0
shifts: 0
-
date: '2026-02-09'
label: '09'
gross: 0
hours: 0
shifts: 0
-
date: '2026-02-10'
label: '10'
gross: 0
hours: 0
shifts: 0
-
date: '2026-02-11'
label: '11'
gross: 0
hours: 0
shifts: 0
-
date: '2026-02-12'
label: '12'
gross: 0
hours: 0
shifts: 0
-
date: '2026-02-13'
label: '13'
gross: 0
hours: 0
shifts: 0
-
date: '2026-02-14'
label: '14'
gross: 0
hours: 0
shifts: 0
-
date: '2026-02-15'
label: '15'
gross: 0
hours: 0
shifts: 0
-
date: '2026-02-16'
label: '16'
gross: 0
hours: 0
shifts: 0
-
date: '2026-02-17'
label: '17'
gross: 0
hours: 0
shifts: 0
-
date: '2026-02-18'
label: '18'
gross: 0
hours: 0
shifts: 0
-
date: '2026-02-19'
label: '19'
gross: 0
hours: 0
shifts: 0
-
date: '2026-02-20'
label: '20'
gross: 0
hours: 0
shifts: 0
-
date: '2026-02-21'
label: '21'
gross: 0
hours: 0
shifts: 0
-
date: '2026-02-22'
label: '22'
gross: 0
hours: 0
shifts: 0
-
date: '2026-02-23'
label: '23'
gross: 0
hours: 0
shifts: 0
-
date: '2026-02-24'
label: '24'
gross: 0
hours: 0
shifts: 0
-
date: '2026-02-25'
label: '25'
gross: 0
hours: 0
shifts: 0
-
date: '2026-02-26'
label: '26'
gross: 0
hours: 0
shifts: 0
-
date: '2026-02-27'
label: '27'
gross: 0
hours: 0
shifts: 0
-
date: '2026-02-28'
label: '28'
gross: 0
hours: 0
shifts: 0
-
date: '2026-03-01'
label: '01'
gross: 0
hours: 0
shifts: 0
-
date: '2026-03-02'
label: '02'
gross: 0
hours: 0
shifts: 0
-
date: '2026-03-03'
label: '03'
gross: 0
hours: 0
shifts: 0
-
date: '2026-03-04'
label: '04'
gross: 0
hours: 0
shifts: 0
-
date: '2026-03-05'
label: '05'
gross: 0
hours: 0
shifts: 0
-
date: '2026-03-06'
label: '06'
gross: 0
hours: 0
shifts: 0
-
date: '2026-03-07'
label: '07'
gross: 0
hours: 0
shifts: 0
-
date: '2026-03-08'
label: '08'
gross: 0
hours: 0
shifts: 0
-
date: '2026-03-09'
label: '09'
gross: 0
hours: 0
shifts: 0
-
date: '2026-03-10'
label: '10'
gross: 0
hours: 0
shifts: 0
-
date: '2026-03-11'
label: '11'
gross: 0
hours: 0
shifts: 0
-
date: '2026-03-12'
label: '12'
gross: 0
hours: 0
shifts: 0
-
date: '2026-03-13'
label: '13'
gross: 0
hours: 0
shifts: 0
-
date: '2026-03-14'
label: '14'
gross: 0
hours: 0
shifts: 0
-
date: '2026-03-15'
label: '15'
gross: 0
hours: 0
shifts: 0
-
date: '2026-03-16'
label: '16'
gross: 0
hours: 0
shifts: 0
-
date: '2026-03-17'
label: '17'
gross: 0
hours: 0
shifts: 0
-
date: '2026-03-18'
label: '18'
gross: 0
hours: 0
shifts: 0
-
date: '2026-03-19'
label: '19'
gross: 0
hours: 0
shifts: 0
-
date: '2026-03-20'
label: '20'
gross: 0
hours: 0
shifts: 0
-
date: '2026-03-21'
label: '21'
gross: 0
hours: 0
shifts: 0
-
date: '2026-03-22'
label: '22'
gross: 0
hours: 0
shifts: 0
-
date: '2026-03-23'
label: '23'
gross: 0
hours: 0
shifts: 0
-
date: '2026-03-24'
label: '24'
gross: 0
hours: 0
shifts: 0
-
date: '2026-03-25'
label: '25'
gross: 0
hours: 0
shifts: 0
-
date: '2026-03-26'
label: '26'
gross: 0
hours: 0
shifts: 0
-
date: '2026-03-27'
label: '27'
gross: 0
hours: 0
shifts: 0
-
date: '2026-03-28'
label: '28'
gross: 0
hours: 0
shifts: 0
-
date: '2026-03-29'
label: '29'
gross: 0
hours: 0
shifts: 0
-
date: '2026-03-30'
label: '30'
gross: 0
hours: 0
shifts: 0
-
date: '2026-03-31'
label: '31'
gross: 0
hours: 0
shifts: 0
-
date: '2026-04-01'
label: '01'
gross: 0
hours: 0
shifts: 0
-
date: '2026-04-02'
label: '02'
gross: 0
hours: 0
shifts: 0
-
date: '2026-04-03'
label: '03'
gross: 0
hours: 0
shifts: 0
-
date: '2026-04-04'
label: '04'
gross: 0
hours: 0
shifts: 0
-
date: '2026-04-05'
label: '05'
gross: 0
hours: 0
shifts: 0
-
date: '2026-04-06'
label: '06'
gross: 0
hours: 0
shifts: 0
-
date: '2026-04-07'
label: '07'
gross: 0
hours: 0
shifts: 0
-
date: '2026-04-08'
label: '08'
gross: 0
hours: 0
shifts: 0
-
date: '2026-04-09'
label: '09'
gross: 0
hours: 0
shifts: 0
-
date: '2026-04-10'
label: '10'
gross: 0
hours: 0
shifts: 0
-
date: '2026-04-11'
label: '11'
gross: 0
hours: 0
shifts: 0
-
date: '2026-04-12'
label: '12'
gross: 0
hours: 0
shifts: 0
-
date: '2026-04-13'
label: '13'
gross: 0
hours: 0
shifts: 0
-
date: '2026-04-14'
label: '14'
gross: 0
hours: 0
shifts: 0
-
date: '2026-04-15'
label: '15'
gross: 0
hours: 0
shifts: 0
-
date: '2026-04-16'
label: '16'
gross: 0
hours: 0
shifts: 0
-
date: '2026-04-17'
label: '17'
gross: 0
hours: 0
shifts: 0
-
date: '2026-04-18'
label: '18'
gross: 0
hours: 0
shifts: 0
-
date: '2026-04-19'
label: '19'
gross: 0
hours: 0
shifts: 0
-
date: '2026-04-20'
label: '20'
gross: 0
hours: 0
shifts: 0
-
date: '2026-04-21'
label: '21'
gross: 0
hours: 0
shifts: 0
-
date: '2026-04-22'
label: '22'
gross: 0
hours: 0
shifts: 0
-
date: '2026-04-23'
label: '23'
gross: 0
hours: 0
shifts: 0
-
date: '2026-04-24'
label: '24'
gross: 0
hours: 0
shifts: 0
-
date: '2026-04-25'
label: '25'
gross: 0
hours: 0
shifts: 0
-
date: '2026-04-26'
label: '26'
gross: 0
hours: 0
shifts: 0
-
date: '2026-04-27'
label: '27'
gross: 0
hours: 0
shifts: 0
-
date: '2026-04-28'
label: '28'
gross: 0
hours: 0
shifts: 0
-
date: '2026-04-29'
label: '29'
gross: 0
hours: 0
shifts: 0
-
date: '2026-04-30'
label: '30'
gross: 0
hours: 0
shifts: 0
-
date: '2026-05-01'
label: '01'
gross: 0
hours: 0
shifts: 0
-
date: '2026-05-02'
label: '02'
gross: 0
hours: 0
shifts: 0
-
date: '2026-05-03'
label: '03'
gross: 0
hours: 0
shifts: 0
-
date: '2026-05-04'
label: '04'
gross: 0
hours: 0
shifts: 0
-
date: '2026-05-05'
label: '05'
gross: 0
hours: 0
shifts: 0
-
date: '2026-05-06'
label: '06'
gross: 0
hours: 0
shifts: 0
-
date: '2026-05-07'
label: '07'
gross: 0
hours: 0
shifts: 0
-
date: '2026-05-08'
label: '08'
gross: 0
hours: 0
shifts: 0
-
date: '2026-05-09'
label: '09'
gross: 0
hours: 0
shifts: 0
-
date: '2026-05-10'
label: '10'
gross: 0
hours: 0
shifts: 0
-
date: '2026-05-11'
label: '11'
gross: 0
hours: 0
shifts: 0
-
date: '2026-05-12'
label: '12'
gross: 0
hours: 0
shifts: 0
-
date: '2026-05-13'
label: '13'
gross: 0
hours: 0
shifts: 0
-
date: '2026-05-14'
label: '14'
gross: 0
hours: 0
shifts: 0
-
date: '2026-05-15'
label: '15'
gross: 0
hours: 0
shifts: 0
-
date: '2026-05-16'
label: '16'
gross: 0
hours: 0
shifts: 0
-
date: '2026-05-17'
label: '17'
gross: 0
hours: 0
shifts: 0
-
date: '2026-05-18'
label: '18'
gross: 0
hours: 0
shifts: 0
-
date: '2026-05-19'
label: '19'
gross: 0
hours: 0
shifts: 0
-
date: '2026-05-20'
label: '20'
gross: 0
hours: 0
shifts: 0
-
date: '2026-05-21'
label: '21'
gross: 0
hours: 0
shifts: 0
-
date: '2026-05-22'
label: '22'
gross: 0
hours: 0
shifts: 0
-
date: '2026-05-23'
label: '23'
gross: 0
hours: 0
shifts: 0
-
date: '2026-05-24'
label: '24'
gross: 0
hours: 0
shifts: 0
-
date: '2026-05-25'
label: '25'
gross: 0
hours: 0
shifts: 0
-
date: '2026-05-26'
label: '26'
gross: 0
hours: 0
shifts: 0
-
date: '2026-05-27'
label: '27'
gross: 0
hours: 0
shifts: 0
-
date: '2026-05-28'
label: '28'
gross: 0
hours: 0
shifts: 0
-
date: '2026-05-29'
label: '29'
gross: 0
hours: 0
shifts: 0
-
date: '2026-05-30'
label: '30'
gross: 0
hours: 0
shifts: 0
-
date: '2026-05-31'
label: '31'
gross: 0
hours: 0
shifts: 0
-
date: '2026-06-01'
label: '01'
gross: 0
hours: 0
shifts: 0
-
date: '2026-06-02'
label: '02'
gross: 0
hours: 0
shifts: 0
-
date: '2026-06-03'
label: '03'
gross: 0
hours: 0
shifts: 0
-
date: '2026-06-04'
label: '04'
gross: 0
hours: 0
shifts: 0
-
date: '2026-06-05'
label: '05'
gross: 0
hours: 0
shifts: 0
-
date: '2026-06-06'
label: '06'
gross: 0
hours: 0
shifts: 0
-
date: '2026-06-07'
label: '07'
gross: 0
hours: 0
shifts: 0
-
date: '2026-06-08'
label: '08'
gross: 0
hours: 0
shifts: 0
-
date: '2026-06-09'
label: '09'
gross: 0
hours: 0
shifts: 0
-
date: '2026-06-10'
label: '10'
gross: 0
hours: 0
shifts: 0
-
date: '2026-06-11'
label: '11'
gross: 0
hours: 0
shifts: 0
-
date: '2026-06-12'
label: '12'
gross: 0
hours: 0
shifts: 0
-
date: '2026-06-13'
label: '13'
gross: 0
hours: 0
shifts: 0
-
date: '2026-06-14'
label: '14'
gross: 0
hours: 0
shifts: 0
-
date: '2026-06-15'
label: '15'
gross: 0
hours: 0
shifts: 0
-
date: '2026-06-16'
label: '16'
gross: 0
hours: 0
shifts: 0
-
date: '2026-06-17'
label: '17'
gross: 0
hours: 0
shifts: 0
-
date: '2026-06-18'
label: '18'
gross: 0
hours: 0
shifts: 0
-
date: '2026-06-19'
label: '19'
gross: 0
hours: 0
shifts: 0
-
date: '2026-06-20'
label: '20'
gross: 0
hours: 0
shifts: 0
-
date: '2026-06-21'
label: '21'
gross: 0
hours: 0
shifts: 0
-
date: '2026-06-22'
label: '22'
gross: 0
hours: 0
shifts: 0
-
date: '2026-06-23'
label: '23'
gross: 0
hours: 0
shifts: 0
-
date: '2026-06-24'
label: '24'
gross: 0
hours: 0
shifts: 0
-
date: '2026-06-25'
label: '25'
gross: 0
hours: 0
shifts: 0
-
date: '2026-06-26'
label: '26'
gross: 0
hours: 0
shifts: 0
-
date: '2026-06-27'
label: '27'
gross: 0
hours: 0
shifts: 0
-
date: '2026-06-28'
label: '28'
gross: 0
hours: 0
shifts: 0
-
date: '2026-06-29'
label: '29'
gross: 0
hours: 0
shifts: 0
-
date: '2026-06-30'
label: '30'
gross: 0
hours: 0
shifts: 0
navigation:
prev: 2025-12
next: 2026-02
tags:
- 'Mobile API'
/api/v1/mobile/reliability:
get:
summary: 'Get Reliability Score'
operationId: getReliabilityScore
description: "Get the employee's reliability score and history."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
reliability:
type: object
properties:
score:
type: integer
examples:
- 100
tier:
type: string
examples:
- excellent
tier_label:
type: string
examples:
- Excellent
window_start:
type: string
examples:
- '2026-02-05'
window_end:
type: string
examples:
- '2026-08-05'
punctuality:
type: object
properties:
percentage:
type:
- string
- 'null'
examples:
- null
activity:
type: object
properties:
hours_worked:
type: integer
examples:
- 0
shifts_completed:
type: integer
examples:
- 1
breakdown:
type: object
properties:
shift_cancellation:
type: integer
examples:
- 0
no_show:
type: integer
examples:
- 0
shift_completion:
type: integer
examples:
- 0
positive_feedback:
type: integer
examples:
- 0
recent_negative:
type: array
examples:
- []
improvement_tips:
type: array
items:
type: string
examples:
-
- 'Build your work history by completing more shifts.'
examples:
-
status: SUCCESS
data:
reliability:
score: 100
tier: excellent
tier_label: Excellent
window_start: '2026-02-05'
window_end: '2026-08-05'
punctuality:
percentage: null
activity:
hours_worked: 0
shifts_completed: 1
breakdown:
shift_cancellation: 0
no_show: 0
shift_completion: 0
positive_feedback: 0
recent_negative: []
improvement_tips:
- 'Build your work history by completing more shifts.'
tags:
- 'Mobile API'
/api/v1/mobile/contracts:
get:
summary: 'List Contracts'
operationId: listContracts
description: 'List all contracts for the authenticated employee.'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
contracts:
type: array
examples:
- []
pagination:
type: object
properties:
current_page:
type: integer
examples:
- 1
last_page:
type: integer
examples:
- 1
per_page:
type: integer
examples:
- 20
total:
type: integer
examples:
- 0
examples:
-
status: SUCCESS
data:
contracts: []
pagination:
current_page: 1
last_page: 1
per_page: 20
total: 0
tags:
- 'Mobile API'
'/api/v1/mobile/contracts/{contractId}':
get:
summary: 'Get Contract'
operationId: getContract
description: 'Get contract details and download URL.'
parameters: []
responses:
503:
description: ''
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- ERROR
message:
type: string
examples:
- 'Service Unavailable'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type:
- string
- 'null'
examples:
- null
message:
type: string
examples:
- 'Service Unavailable'
examples:
-
-
field: null
message: 'Service Unavailable'
meta:
type: object
properties:
request_id:
type: string
examples:
- 1b3b99d9-6927-4218-9edf-6c81f2bb5ebf
timestamp:
type: string
examples:
- '2026-08-21T05:14:34.095638Z'
examples:
-
status: ERROR
message: 'Service Unavailable'
data: null
errors:
-
field: null
message: 'Service Unavailable'
meta:
request_id: 1b3b99d9-6927-4218-9edf-6c81f2bb5ebf
timestamp: '2026-08-21T05:14:34.095638Z'
tags:
- 'Mobile API'
parameters:
-
in: path
name: contractId
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
'/api/v1/mobile/contracts/{contractId}/sign':
post:
summary: 'Sign Contract'
operationId: signContract
description: "The worker signs a contract — the framework agreement before applying to\nanything, or an Überlassungsvertrag.\n\nA selection produces **one Überlassungsvertrag per shift**, not one for\nthe batch: a company can set contract terms on a single shift, so each\nshift is agreed to on its own. A worker selected for three days has\nthree to sign, and signing one readies that shift alone — the others\nstay `pending_signature` with their own deadlines.\n\nTwo things are required together: an explicit consent flag, and the\nsignature they drew. The drawing is stamped onto the PDF and bound into\nits hash, so a contract cannot later be altered without the signature\nceasing to match."
parameters: []
responses: { }
tags:
- 'Mobile API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
signature_consent:
type: boolean
description: "The worker's agreement to be bound by the contract. Must be true — anything else is refused."
examples:
- true
signature_data:
type: string
description: 'The signature the worker drew, as base64 PNG or JPEG. The `data:image/png;base64,` prefix is optional — raw base64 from a canvas is accepted and stored with the prefix added. The format is read from the decoded bytes, so a prefix that disagrees with the image is refused. Max 500 KB. Stamped onto the PDF and bound into its tamper-evidence hash.'
examples:
- iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==
required:
- signature_consent
- signature_data
parameters:
-
in: path
name: contractId
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
/api/v1/mobile/support/tickets:
get:
summary: 'List Tickets'
operationId: listTickets
description: 'List all support tickets for the authenticated user.'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
tickets:
type: array
items:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-2e3b-7096-97f9-96d4a481c803
ticket_number:
type: string
examples:
- TKT-969367
category:
type: string
examples:
- complaint
category_label:
type: string
examples:
- Beschwerde
status:
type: string
examples:
- open
status_label:
type: string
examples:
- Offen
subject:
type: string
examples:
- 'Totam autem repellendus quasi iste debitis fugiat.'
priority:
type: integer
examples:
- 2
created_at:
type: string
examples:
- '2026-08-05 16:18'
resolved_at:
type:
- string
- 'null'
examples:
- null
has_unread:
type: boolean
examples:
- false
examples:
-
-
id: 019fd2b8-2e3b-7096-97f9-96d4a481c803
ticket_number: TKT-969367
category: complaint
category_label: Beschwerde
status: open
status_label: Offen
subject: 'Totam autem repellendus quasi iste debitis fugiat.'
priority: 2
created_at: '2026-08-05 16:18'
resolved_at: null
has_unread: false
pagination:
type: object
properties:
current_page:
type: integer
examples:
- 1
last_page:
type: integer
examples:
- 1
per_page:
type: integer
examples:
- 20
total:
type: integer
examples:
- 1
examples:
-
status: SUCCESS
data:
tickets:
-
id: 019fd2b8-2e3b-7096-97f9-96d4a481c803
ticket_number: TKT-969367
category: complaint
category_label: Beschwerde
status: open
status_label: Offen
subject: 'Totam autem repellendus quasi iste debitis fugiat.'
priority: 2
created_at: '2026-08-05 16:18'
resolved_at: null
has_unread: false
pagination:
current_page: 1
last_page: 1
per_page: 20
total: 1
tags:
- 'Mobile API'
post:
summary: 'Create Ticket'
operationId: createTicket
description: 'Create a new support ticket (worker requester).'
parameters: []
responses: { }
tags:
- 'Mobile API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
category:
type: string
description: 'Allowed: general, shift, payment, contract, account, technical, complaint, profile_change, document, other.'
examples:
- general
subject:
type: string
description: ''
examples:
- 'Frage zur Abrechnung'
description:
type: string
description: ''
examples:
- Beispieltext
related_entity_type:
type: string
description: 'Allowed: shift, contract, job.'
examples:
- shift
related_entity_id:
type: string
description: ''
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
required:
- category
- subject
- description
'/api/v1/mobile/support/tickets/{ticketId}':
get:
summary: 'Get Ticket'
operationId: getTicket
description: 'Get a support ticket with messages.'
parameters: []
responses:
503:
description: ''
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- ERROR
message:
type: string
examples:
- 'Service Unavailable'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type:
- string
- 'null'
examples:
- null
message:
type: string
examples:
- 'Service Unavailable'
examples:
-
-
field: null
message: 'Service Unavailable'
meta:
type: object
properties:
request_id:
type: string
examples:
- 605f390a-b139-4dc7-838f-1ae2277ef187
timestamp:
type: string
examples:
- '2026-08-21T05:14:34.145889Z'
examples:
-
status: ERROR
message: 'Service Unavailable'
data: null
errors:
-
field: null
message: 'Service Unavailable'
meta:
request_id: 605f390a-b139-4dc7-838f-1ae2277ef187
timestamp: '2026-08-21T05:14:34.145889Z'
tags:
- 'Mobile API'
parameters:
-
in: path
name: ticketId
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
'/api/v1/mobile/support/tickets/{ticketId}/messages':
post:
summary: 'Add Ticket Message'
operationId: addTicketMessage
description: 'Add a message to an existing ticket.'
parameters: []
responses: { }
tags:
- 'Mobile API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
message:
type: string
description: ''
examples:
- 'Bitte um Rueckmeldung zur naechsten Schicht.'
required:
- message
parameters:
-
in: path
name: ticketId
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
/api/v1/mobile/messages/conversations:
get:
summary: 'List Conversations'
operationId: listConversations
description: 'List conversations for the authenticated mobile user.'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
conversations:
type: array
items:
type: object
properties:
id:
type: string
examples:
- 64c3f8d8-55d2-4457-b394-c3277a378bac
organization:
type: object
properties:
id:
type: string
examples:
- 019fd2b7-f072-7154-8961-5b324cc6c46c
name:
type: string
examples:
- Caritas
logo_url:
type:
- string
- 'null'
examples:
- null
job:
type:
- string
- 'null'
examples:
- null
last_message:
type:
- string
- 'null'
examples:
- null
unread_count:
type: integer
examples:
- 0
last_message_at:
type: string
examples:
- '2026-08-05T16:18:32+00:00'
examples:
-
-
id: 64c3f8d8-55d2-4457-b394-c3277a378bac
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
logo_url: null
job: null
last_message: null
unread_count: 0
last_message_at: '2026-08-05T16:18:32+00:00'
examples:
-
status: SUCCESS
data:
conversations:
-
id: 64c3f8d8-55d2-4457-b394-c3277a378bac
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
logo_url: null
job: null
last_message: null
unread_count: 0
last_message_at: '2026-08-05T16:18:32+00:00'
tags:
- 'Mobile API'
'/api/v1/mobile/messages/conversations/{conversation_id}':
get:
summary: 'Get Messages'
operationId: getMessages
description: 'Get messages for a conversation (mobile user perspective).'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
messages:
type: array
examples:
- []
pagination:
type: object
properties:
current_page:
type: integer
examples:
- 1
last_page:
type: integer
examples:
- 1
per_page:
type: integer
examples:
- 50
total:
type: integer
examples:
- 0
examples:
-
status: SUCCESS
data:
messages: []
pagination:
current_page: 1
last_page: 1
per_page: 50
total: 0
tags:
- 'Mobile API'
post:
summary: 'Reply To Conversation'
operationId: replyToConversation
description: 'Reply to an existing conversation (mobile user perspective).'
parameters: []
responses:
201:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
message:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-3b63-72cd-84f1-aeb06cd822ba
conversation_id:
type: string
examples:
- 64c3f8d8-55d2-4457-b394-c3277a378bac
content:
type: string
examples:
- Beispieltext
is_from_user:
type: boolean
examples:
- true
created_at:
type: string
examples:
- '2026-08-05T16:18:37+00:00'
examples:
-
status: SUCCESS
data:
message:
id: 019fd2b8-3b63-72cd-84f1-aeb06cd822ba
conversation_id: 64c3f8d8-55d2-4457-b394-c3277a378bac
content: Beispieltext
is_from_user: true
created_at: '2026-08-05T16:18:37+00:00'
tags:
- 'Mobile API'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
content:
type:
- string
- 'null'
description: 'Required unless attachments are present.'
examples:
- Beispieltext
attachments:
type: array
description: 'IDs from the attachment upload endpoint.'
items:
type: string
examples:
- null
parameters:
-
in: path
name: conversation_id
description: 'The ID of the conversation.'
required: true
schema:
type: string
examples:
- 019fd51d-53c7-73d0-880d-8edee1800329
-
in: path
name: conversation
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
'/api/v1/mobile/messages/conversations/{conversation}/attachments':
post:
summary: 'Upload a Message Attachment'
operationId: uploadAMessageAttachment
description: "Upload a file attachment ahead of sending it with a message. The\nreturned attachment id is bound to a message when that message is sent."
parameters: []
responses:
201:
description: Uploaded
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
attachment:
type: object
properties:
id:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
name:
type: string
examples:
- beleg.pdf
mime_type:
type: string
examples:
- application/pdf
file_size:
type: integer
examples:
- 48213
examples:
-
status: SUCCESS
data:
attachment:
id: 019f9939-c4c3-70fb-a54e-5ebf63db36d2
name: beleg.pdf
mime_type: application/pdf
file_size: 48213
tags:
- 'Mobile API'
requestBody:
required: true
content:
multipart/form-data:
schema:
type: object
properties:
file:
type: string
format: binary
description: 'The photo or document.'
required:
- file
parameters:
-
in: path
name: conversation
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
/api/v1/mobile/messages:
post:
summary: 'Send Message'
operationId: sendMessage
description: 'Send a message to an organization from the mobile user.'
parameters: []
responses:
201:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
message:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-3b7b-706f-9077-c559f02b838a
conversation_id:
type: string
examples:
- 019fd2b8-3b78-703e-bc22-0286223114aa
content:
type: string
examples:
- Beispieltext
created_at:
type: string
examples:
- '2026-08-05T16:18:37+00:00'
examples:
-
status: SUCCESS
data:
message:
id: 019fd2b8-3b7b-706f-9077-c559f02b838a
conversation_id: 019fd2b8-3b78-703e-bc22-0286223114aa
content: Beispieltext
created_at: '2026-08-05T16:18:37+00:00'
tags:
- 'Mobile API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
organization_id:
type: string
description: ''
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
content:
type:
- string
- 'null'
description: 'Required unless attachments are present.'
examples:
- Beispieltext
job_id:
type:
- string
- 'null'
description: ''
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
shift_id:
type:
- string
- 'null'
description: ''
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
attachments:
type: array
description: 'IDs from the attachment upload endpoint.'
items:
type: string
examples:
- null
required:
- organization_id
/api/v1/admin/auth/login:
post:
summary: 'Login Admin'
operationId: loginAdmin
description: 'Authenticates an administrator against the `admin` guard and issues a Sanctum token. Inactive admin accounts are rejected before credential verification to prevent timing-based enumeration of deactivated accounts.'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Login successful.'
data:
type: object
properties:
token:
type: string
examples:
- 14|Qd0Pxqa8ulXyaGJEB8Ylpxe6EUYq02DMJzPtUTV5e9f2582f
admin:
type: object
properties:
id:
type: string
examples:
- 019fd2b7-edab-7280-b09f-b18f58a272ee
name:
type: string
examples:
- 'Super Admin'
email:
type: string
examples:
- office@flexxr.at
role:
type: string
examples:
- super_admin
is_active:
type: boolean
examples:
- true
last_login_at:
type: string
examples:
- '2026-08-05T16:18:40.000000Z'
created_at:
type: string
examples:
- '2026-08-05T16:18:17.000000Z'
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 46530e7b-851c-4aab-b7fe-66d6253aeabb
timestamp:
type: string
examples:
- '2026-08-05T16:18:40.986452Z'
examples:
-
status: SUCCESS
message: 'Login successful.'
data:
token: 14|Qd0Pxqa8ulXyaGJEB8Ylpxe6EUYq02DMJzPtUTV5e9f2582f
admin:
id: 019fd2b7-edab-7280-b09f-b18f58a272ee
name: 'Super Admin'
email: office@flexxr.at
role: super_admin
is_active: true
last_login_at: '2026-08-05T16:18:40.000000Z'
created_at: '2026-08-05T16:18:17.000000Z'
errors: null
meta:
request_id: 46530e7b-851c-4aab-b7fe-66d6253aeabb
timestamp: '2026-08-05T16:18:40.986452Z'
401:
description: ''
content:
application/json:
schema:
oneOf:
-
description: '2FA Required'
type: object
properties:
status:
type: string
examples:
- TWO_FACTOR_REQUIRED
message:
type: string
examples:
- 'Two-factor authentication is required.'
data:
type: object
properties:
token:
type: string
examples:
- 2|challenge-token...
two_factor_method:
type: string
examples:
- totp
errors:
type: array
items:
type: object
properties:
field:
type:
- string
- 'null'
examples:
- null
message:
type: string
examples:
- 'Two-factor authentication is required.'
examples:
-
-
field: null
message: 'Two-factor authentication is required.'
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-04-02T12:00:00.000000Z'
examples:
-
status: TWO_FACTOR_REQUIRED
message: 'Two-factor authentication is required.'
data:
token: 2|challenge-token...
two_factor_method: totp
errors:
-
field: null
message: 'Two-factor authentication is required.'
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-04-02T12:00:00.000000Z'
-
description: 'Invalid Credentials'
type: object
properties:
status:
type: string
examples:
- INVALID_CREDENTIALS
message:
type: string
examples:
- 'The provided credentials are incorrect.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type: string
examples:
- email
message:
type: string
examples:
- 'The provided credentials are incorrect.'
examples:
-
-
field: email
message: 'The provided credentials are incorrect.'
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-04-02T12:00:00.000000Z'
examples:
-
status: INVALID_CREDENTIALS
message: 'The provided credentials are incorrect.'
data: null
errors:
-
field: email
message: 'The provided credentials are incorrect.'
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-04-02T12:00:00.000000Z'
422:
description: 'Validation Error'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- VALIDATION_ERROR
message:
type: string
examples:
- 'The given data was invalid.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type: string
examples:
- email
message:
type: string
examples:
- 'The email field is required.'
examples:
-
-
field: email
message: 'The email field is required.'
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-04-02T12:00:00.000000Z'
examples:
-
status: VALIDATION_ERROR
message: 'The given data was invalid.'
data: null
errors:
-
field: email
message: 'The email field is required.'
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-04-02T12:00:00.000000Z'
423:
description: 'Account Temporarily Locked'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- ACCOUNT_TEMPORARILY_LOCKED
message:
type: string
examples:
- 'Account temporarily locked. Try again in 15 minutes.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type: string
examples:
- email
message:
type: string
examples:
- 'Account temporarily locked. Try again in 15 minutes.'
examples:
-
-
field: email
message: 'Account temporarily locked. Try again in 15 minutes.'
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-04-02T12:00:00.000000Z'
examples:
-
status: ACCOUNT_TEMPORARILY_LOCKED
message: 'Account temporarily locked. Try again in 15 minutes.'
data: null
errors:
-
field: email
message: 'Account temporarily locked. Try again in 15 minutes.'
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-04-02T12:00:00.000000Z'
tags:
- 'Admin API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
email:
type:
- string
- 'null'
description: 'Admin email address.'
examples:
- admin@flexxr.at
country_code:
type:
- string
- 'null'
description: 'Country code with + prefix. Required together with phone_number for phone login. This field is required when phone_number is present. Must match the regex /^\+\d{1,4}$/. Must not be greater than 5 characters.'
examples:
- '+43'
phone_number:
type:
- string
- 'null'
description: 'Phone number without country code. Required together with country_code for phone login. This field is required when country_code is present. Must match the regex /^\d{6,15}$/. Must not be greater than 15 characters.'
examples:
- '6641234567'
password:
type: string
description: 'Plain-text password (min 8 characters).'
examples:
- AdminSecure123
code:
type:
- string
- 'null'
description: 'Optional 2FA one-time code (TOTP or email OTP) for single-step 2FA login.'
examples:
- '123456'
recovery_code:
type:
- string
- 'null'
description: 'Optional 2FA recovery code in place of `code`.'
examples:
- ABCD-1234-EFGH
remember_me:
type: boolean
description: ''
examples:
- true
required:
- email
- password
security: []
/api/v1/admin/dashboard/stats:
get:
summary: 'Get Admin Dashboard Stats'
operationId: getAdminDashboardStats
description: "Aggregate counts for the admin dashboard's KPI tiles."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- Success
data:
type: object
properties:
pending_employees:
type: integer
examples:
- 1
pending_companies:
type: integer
examples:
- 1
active_jobs:
type: integer
examples:
- 109
ongoing_assignments:
type: integer
examples:
- 1
overdue_invoices:
type: integer
examples:
- 0
open_tickets:
type: integer
examples:
- 2
fraud_alerts:
type: integer
examples:
- 0
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 3a5fb11c-8caa-4c3e-8d97-0efd8c8c83bc
timestamp:
type: string
examples:
- '2026-08-05T16:18:41.679890Z'
examples:
-
status: SUCCESS
message: Success
data:
pending_employees: 1
pending_companies: 1
active_jobs: 109
ongoing_assignments: 1
overdue_invoices: 0
open_tickets: 2
fraud_alerts: 0
errors: null
meta:
request_id: 3a5fb11c-8caa-4c3e-8d97-0efd8c8c83bc
timestamp: '2026-08-05T16:18:41.679890Z'
tags:
- 'Admin API'
/api/v1/admin/users:
get:
summary: 'List Users'
operationId: listUsers
description: 'Returns a paginated list of all users, optionally filtered by a search term (matched against name and email) and/or a status value.'
parameters:
-
in: query
name: search
description: 'Search keyword.'
required: false
schema:
type: string
description: 'Search keyword.'
examples:
- test
-
in: query
name: status
description: 'Filter by status.'
required: false
schema:
type: string
description: 'Filter by status.'
examples:
- active
-
in: query
name: per_page
description: 'Number of items per page.'
required: false
schema:
type: integer
description: 'Number of items per page.'
examples:
- 15
-
in: query
name: sort
description: 'Column to sort by.'
required: false
schema:
type: string
description: 'Column to sort by.'
examples:
- first_name
-
in: query
name: order
description: '"asc" or "desc".'
required: false
schema:
type: string
description: '"asc" or "desc".'
examples:
- asc
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- Success
data:
type: array
examples:
- []
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- b0862681-9b77-4cd1-bf0b-b07077be4ce1
timestamp:
type: string
examples:
- '2026-08-05T16:18:41.691650Z'
current_page:
type: integer
examples:
- 1
last_page:
type: integer
examples:
- 1
per_page:
type: integer
examples:
- 15
total:
type: integer
examples:
- 0
examples:
-
status: SUCCESS
message: Success
data: []
errors: null
meta:
request_id: b0862681-9b77-4cd1-bf0b-b07077be4ce1
timestamp: '2026-08-05T16:18:41.691650Z'
current_page: 1
last_page: 1
per_page: 15
total: 0
tags:
- 'Admin API'
'/api/v1/admin/users/{user_id}':
get:
summary: 'Returns the full profile of a single user, identified by route-model binding.'
operationId: returnsTheFullProfileOfASingleUserIdentifiedByRouteModelBinding
description: ''
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'User retrieved successfully.'
data:
type: object
properties:
id:
type: string
examples:
- 019fd2b7-f271-73fd-8268-848be381e136
first_name:
type: string
examples:
- Anna
last_name:
type: string
examples:
- Neuling
email:
type: string
examples:
- pending@demo.flexxr.at
country_code:
type: string
examples:
- '+43'
phone_number:
type: string
examples:
- '6769876543'
status:
type: string
examples:
- active
avatar_url:
type:
- string
- 'null'
examples:
- null
bio:
type:
- string
- 'null'
examples:
- null
date_of_birth:
type:
- string
- 'null'
examples:
- null
country:
type:
- string
- 'null'
examples:
- null
city:
type:
- string
- 'null'
examples:
- null
notify_push:
type: boolean
examples:
- true
notify_email:
type: boolean
examples:
- true
notify_sms:
type: boolean
examples:
- true
notify_marketing:
type: boolean
examples:
- false
email_verified_at:
type: string
examples:
- '2026-08-05T16:18:32+00:00'
phone_verified_at:
type: string
examples:
- '2026-08-05T16:18:32+00:00'
created_at:
type: string
examples:
- '2026-08-05T16:18:18+00:00'
updated_at:
type: string
examples:
- '2026-08-05T16:18:33+00:00'
employee_profile:
type:
- string
- 'null'
examples:
- null
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- f29df2ed-2159-4b94-a318-cb28112ce82a
timestamp:
type: string
examples:
- '2026-08-05T16:18:41.701057Z'
examples:
-
status: SUCCESS
message: 'User retrieved successfully.'
data:
id: 019fd2b7-f271-73fd-8268-848be381e136
first_name: Anna
last_name: Neuling
email: pending@demo.flexxr.at
country_code: '+43'
phone_number: '6769876543'
status: active
avatar_url: null
bio: null
date_of_birth: null
country: null
city: null
notify_push: true
notify_email: true
notify_sms: true
notify_marketing: false
email_verified_at: '2026-08-05T16:18:32+00:00'
phone_verified_at: '2026-08-05T16:18:32+00:00'
created_at: '2026-08-05T16:18:18+00:00'
updated_at: '2026-08-05T16:18:33+00:00'
employee_profile: null
errors: null
meta:
request_id: f29df2ed-2159-4b94-a318-cb28112ce82a
timestamp: '2026-08-05T16:18:41.701057Z'
tags:
- 'Admin API'
patch:
summary: "Updates an employee's profile fields (identity, contact, address) on\nbehalf of an admin."
operationId: updatesAnEmployeesProfileFieldsidentityContactAddressOnBehalfOfAnAdmin
description: "Status transitions, password rotations, anonymisation and email-change\nconfirmations all have dedicated endpoints with their own audit events\nand are intentionally not handled here.\n\nAddress fields (address_line_1, address_line_2, postal_code) are stored\non the employee_profiles table, while identity and basic location\n(city, country) remain on the users table.\n\nGDPR Art. 30 record-of-processing is satisfied by writing a\n`user.updated_by_admin` audit event listing only the names of the\nfields that changed — never the cleartext values themselves. The new\nvalues remain authoritative on the User/EmployeeProfile rows, the\nprevious values can be reconstructed from immutable backups if a\nforensic review is needed."
parameters: []
responses: { }
tags:
- 'Admin API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
first_name:
type: string
description: ''
examples:
- Beispieltext
last_name:
type: string
description: ''
examples:
- Beispieltext
bio:
type:
- string
- 'null'
description: ''
examples:
- Beispieltext
date_of_birth:
type:
- date
- 'null'
description: ''
examples:
- '2026-09-30'
country_code:
type:
- string
- 'null'
description: ''
examples:
- AT
phone_number:
type:
- string
- 'null'
description: ''
examples:
- '6641234567'
address_line_1:
type:
- string
- 'null'
description: ''
examples:
- Beispieltext
address_line_2:
type:
- string
- 'null'
description: ''
examples:
- Beispieltext
postal_code:
type:
- string
- 'null'
description: ''
examples:
- AT
city:
type:
- string
- 'null'
description: ''
examples:
- Beispieltext
country:
type:
- string
- 'null'
description: ''
examples:
- Beispieltext
required:
- country_code
- phone_number
parameters:
-
in: path
name: user_id
description: 'The ID of the user.'
required: true
schema:
type: string
examples:
- 019f0593-c75f-7265-bb3d-278a77f5a95f
'/api/v1/admin/users/{user_id}/status':
put:
summary: 'Updates the status of an existing user account.'
operationId: updatesTheStatusOfAnExistingUserAccount
description: "Delegates the status transition (including token revocation for\n\ndeactivated/banned users) to UserService. * @group Admin API"
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'User status updated successfully.'
data:
type: object
properties:
id:
type: string
examples:
- 019fd2b7-f271-73fd-8268-848be381e136
first_name:
type: string
examples:
- Anna
last_name:
type: string
examples:
- Neuling
email:
type: string
examples:
- pending@demo.flexxr.at
country_code:
type: string
examples:
- '+43'
phone_number:
type: string
examples:
- '6769876543'
status:
type: string
examples:
- active
avatar_url:
type:
- string
- 'null'
examples:
- null
bio:
type:
- string
- 'null'
examples:
- null
date_of_birth:
type:
- string
- 'null'
examples:
- null
country:
type:
- string
- 'null'
examples:
- null
city:
type:
- string
- 'null'
examples:
- null
notify_push:
type: boolean
examples:
- true
notify_email:
type: boolean
examples:
- true
notify_sms:
type: boolean
examples:
- true
notify_marketing:
type: boolean
examples:
- false
email_verified_at:
type: string
examples:
- '2026-08-05T16:18:32+00:00'
phone_verified_at:
type: string
examples:
- '2026-08-05T16:18:32+00:00'
created_at:
type: string
examples:
- '2026-08-05T16:18:18+00:00'
updated_at:
type: string
examples:
- '2026-08-05T16:18:33+00:00'
employee_profile:
type:
- string
- 'null'
examples:
- null
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- b855ec49-4087-41ca-8107-b867ec67bdb0
timestamp:
type: string
examples:
- '2026-08-05T16:18:41.723038Z'
examples:
-
status: SUCCESS
message: 'User status updated successfully.'
data:
id: 019fd2b7-f271-73fd-8268-848be381e136
first_name: Anna
last_name: Neuling
email: pending@demo.flexxr.at
country_code: '+43'
phone_number: '6769876543'
status: active
avatar_url: null
bio: null
date_of_birth: null
country: null
city: null
notify_push: true
notify_email: true
notify_sms: true
notify_marketing: false
email_verified_at: '2026-08-05T16:18:32+00:00'
phone_verified_at: '2026-08-05T16:18:32+00:00'
created_at: '2026-08-05T16:18:18+00:00'
updated_at: '2026-08-05T16:18:33+00:00'
employee_profile: null
errors: null
meta:
request_id: b855ec49-4087-41ca-8107-b867ec67bdb0
timestamp: '2026-08-05T16:18:41.723038Z'
tags:
- 'Admin API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
status:
type: string
description: 'Allowed: active, banned, deactivated.'
examples:
- active
required:
- status
parameters:
-
in: path
name: user_id
description: 'The ID of the user.'
required: true
schema:
type: string
examples:
- 019f0593-c75f-7265-bb3d-278a77f5a95f
'/api/v1/admin/users/{user_id}/send-reset':
post:
summary: 'Admin-triggered user password reset email.'
operationId: adminTriggeredUserPasswordResetEmail
description: "Sends the user a 6-digit code using the same code-based flow as\nself-service forgot-password. The mobile app handles the code entry."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Password reset email sent.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 95f42427-a958-4322-af06-e36c986887c8
timestamp:
type: string
examples:
- '2026-08-05T16:18:41.738923Z'
examples:
-
status: SUCCESS
message: 'Password reset email sent.'
data: null
errors: null
meta:
request_id: 95f42427-a958-4322-af06-e36c986887c8
timestamp: '2026-08-05T16:18:41.738923Z'
tags:
- 'Admin API'
parameters:
-
in: path
name: user_id
description: 'The ID of the user.'
required: true
schema:
type: string
examples:
- 019f0593-c75f-7265-bb3d-278a77f5a95f
/api/v1/admin/admins:
post:
summary: 'Creates a new admin account.'
operationId: createsANewAdminAccount
description: "The super-admin route middleware enforces the role restriction. The\nnewly created admin is active by default; they must log in and\noptionally enable 2FA themselves. No welcome email is sent — the\n\nsuper admin communicates credentials out-of-band. * @group Admin API"
parameters: []
responses:
201:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- CREATED
message:
type: string
examples:
- 'Admin created successfully.'
data:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-520f-7027-b522-08e9a33b49b3
name:
type: string
examples:
- Beispieltext
email:
type: string
examples:
- name@example.at
role:
type: string
examples:
- super_admin
is_active:
type: boolean
examples:
- true
last_login_at:
type:
- string
- 'null'
examples:
- null
created_at:
type: string
examples:
- '2026-08-05T16:18:42.000000Z'
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 8cdc19e4-93ff-4e3f-b229-fee0e489d02b
timestamp:
type: string
examples:
- '2026-08-05T16:18:42.843825Z'
examples:
-
status: CREATED
message: 'Admin created successfully.'
data:
id: 019fd2b8-520f-7027-b522-08e9a33b49b3
name: Beispieltext
email: name@example.at
role: super_admin
is_active: true
last_login_at: null
created_at: '2026-08-05T16:18:42.000000Z'
errors: null
meta:
request_id: 8cdc19e4-93ff-4e3f-b229-fee0e489d02b
timestamp: '2026-08-05T16:18:42.843825Z'
tags:
- 'Admin API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: ''
examples:
- Beispieltext
email:
type: string
description: ''
examples:
- name@example.at
password:
type: string
description: ''
examples:
- S3cure-Passw0rd!
role:
type: string
description: 'Allowed: super_admin, payroll_admin, payroll_agent, compliance_officer, compliance_agent, support_supervisor, support_agent, ops_manager, ops_agent, finance_admin, finance_agent.'
examples:
- super_admin
required:
- name
- email
- password
- role
get:
summary: 'List Admins'
operationId: listAdmins
description: 'Returns a paginated list of all admin accounts, with optional filters.'
parameters:
-
in: query
name: search
description: 'Partial match on name or email.'
required: false
schema:
type: string
description: 'Partial match on name or email.'
examples:
- john
-
in: query
name: role
description: 'Filter by role (super_admin, admin, moderator).'
required: false
schema:
type: string
description: 'Filter by role (super_admin, admin, moderator).'
examples:
- admin
-
in: query
name: is_active
description: 'Filter by active status.'
required: false
schema:
type: boolean
description: 'Filter by active status.'
examples:
- true
-
in: query
name: per_page
description: 'Items per page.'
required: false
schema:
type: integer
description: 'Items per page.'
examples:
- 15
-
in: query
name: sort
description: 'Column to sort by.'
required: false
schema:
type: string
description: 'Column to sort by.'
examples:
- name
-
in: query
name: order
description: '"asc" or "desc".'
required: false
schema:
type: string
description: '"asc" or "desc".'
examples:
- asc
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- Success
data:
type: array
examples:
- []
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 864a4b86-aeb4-4ca0-b5dc-29ebed259c97
timestamp:
type: string
examples:
- '2026-08-05T16:18:42.604748Z'
current_page:
type: integer
examples:
- 1
last_page:
type: integer
examples:
- 1
per_page:
type: integer
examples:
- 15
total:
type: integer
examples:
- 0
examples:
-
status: SUCCESS
message: Success
data: []
errors: null
meta:
request_id: 864a4b86-aeb4-4ca0-b5dc-29ebed259c97
timestamp: '2026-08-05T16:18:42.604748Z'
current_page: 1
last_page: 1
per_page: 15
total: 0
403:
description: Forbidden
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- FORBIDDEN
message:
type: string
examples:
- Forbidden.
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type:
- string
- 'null'
examples:
- null
message:
type: string
examples:
- Forbidden.
examples:
-
-
field: null
message: Forbidden.
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-04-02T12:00:00.000000Z'
examples:
-
status: FORBIDDEN
message: Forbidden.
data: null
errors:
-
field: null
message: Forbidden.
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-04-02T12:00:00.000000Z'
tags:
- 'Admin API'
'/api/v1/admin/admins/{admin_id}':
get:
summary: 'Returns the profile of a single admin, identified by route-model binding. * @group Admin API'
operationId: returnsTheProfileOfASingleAdminIdentifiedByRouteModelBindinggroupAdminAPI
description: ''
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Admin retrieved successfully.'
data:
type: object
properties:
id:
type: string
examples:
- 019fd2b7-edab-7280-b09f-b18f58a272ee
name:
type: string
examples:
- 'Super Admin'
email:
type: string
examples:
- office@flexxr.at
role:
type: string
examples:
- super_admin
is_active:
type: boolean
examples:
- true
last_login_at:
type:
- string
- 'null'
examples:
- null
created_at:
type: string
examples:
- '2026-08-05T16:18:17.000000Z'
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- b038e712-95bd-458e-89ed-02e96b78f138
timestamp:
type: string
examples:
- '2026-08-05T16:18:42.853899Z'
examples:
-
status: SUCCESS
message: 'Admin retrieved successfully.'
data:
id: 019fd2b7-edab-7280-b09f-b18f58a272ee
name: 'Super Admin'
email: office@flexxr.at
role: super_admin
is_active: true
last_login_at: null
created_at: '2026-08-05T16:18:17.000000Z'
errors: null
meta:
request_id: b038e712-95bd-458e-89ed-02e96b78f138
timestamp: '2026-08-05T16:18:42.853899Z'
tags:
- 'Admin API'
parameters:
-
in: path
name: admin_id
description: 'The ID of the admin.'
required: true
schema:
type: string
examples:
- 019f0593-c378-72f0-84b7-8adf1820207f
'/api/v1/admin/admins/{admin_id}/role':
put:
summary: 'Changes the role of an existing admin account.'
operationId: changesTheRoleOfAnExistingAdminAccount
description: "Guards against self-demotion: a super admin cannot downgrade their own\nrole, preventing accidental lock-out when they are the only super admin.\n\nOn every successful role change, the matching ACL preset is also swapped\nso the legacy `admin.role` column and the `acl_actor_presets` pivot stay\nin sync. The role update and the preset swap run inside one transaction."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Admin role updated successfully.'
data:
type: object
properties:
id:
type: string
examples:
- 019fd2b7-edab-7280-b09f-b18f58a272ee
name:
type: string
examples:
- 'Super Admin'
email:
type: string
examples:
- office@flexxr.at
role:
type: string
examples:
- super_admin
is_active:
type: boolean
examples:
- true
last_login_at:
type:
- string
- 'null'
examples:
- null
created_at:
type: string
examples:
- '2026-08-05T16:18:17.000000Z'
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- cc178b32-00a9-4fb3-8c59-eeeb3d3fb9c5
timestamp:
type: string
examples:
- '2026-08-05T16:18:42.871916Z'
examples:
-
status: SUCCESS
message: 'Admin role updated successfully.'
data:
id: 019fd2b7-edab-7280-b09f-b18f58a272ee
name: 'Super Admin'
email: office@flexxr.at
role: super_admin
is_active: true
last_login_at: null
created_at: '2026-08-05T16:18:17.000000Z'
errors: null
meta:
request_id: cc178b32-00a9-4fb3-8c59-eeeb3d3fb9c5
timestamp: '2026-08-05T16:18:42.871916Z'
tags:
- 'Admin API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
role:
type: string
description: 'Allowed: super_admin, payroll_admin, payroll_agent, compliance_officer, compliance_agent, support_supervisor, support_agent, ops_manager, ops_agent, finance_admin, finance_agent.'
examples:
- super_admin
required:
- role
parameters:
-
in: path
name: admin_id
description: 'The ID of the admin.'
required: true
schema:
type: string
examples:
- 019f0593-c378-72f0-84b7-8adf1820207f
'/api/v1/admin/admins/{admin_id}/deactivate':
put:
summary: 'Deactivates an admin account and revokes all their Sanctum tokens.'
operationId: deactivatesAnAdminAccountAndRevokesAllTheirSanctumTokens
description: "Guards against self-deactivation to prevent a super admin from\n\naccidentally locking themselves out of the dashboard. * @group Admin API"
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Admin deactivated successfully.'
data:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-29c6-70eb-b55e-61878b3ad363
name:
type: string
examples:
- 'Timothy Goyette I'
email:
type: string
examples:
- klein.jeffrey@example.com
role:
type: string
examples:
- support_agent
is_active:
type: boolean
examples:
- false
last_login_at:
type:
- string
- 'null'
examples:
- null
created_at:
type: string
examples:
- '2026-08-05T16:18:32.000000Z'
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 043c8f6f-b451-4f1f-8aa3-a1b9ad17ee99
timestamp:
type: string
examples:
- '2026-08-05T16:18:42.890951Z'
examples:
-
status: SUCCESS
message: 'Admin deactivated successfully.'
data:
id: 019fd2b8-29c6-70eb-b55e-61878b3ad363
name: 'Timothy Goyette I'
email: klein.jeffrey@example.com
role: support_agent
is_active: false
last_login_at: null
created_at: '2026-08-05T16:18:32.000000Z'
errors: null
meta:
request_id: 043c8f6f-b451-4f1f-8aa3-a1b9ad17ee99
timestamp: '2026-08-05T16:18:42.890951Z'
tags:
- 'Admin API'
parameters:
-
in: path
name: admin_id
description: 'The ID of the admin.'
required: true
schema:
type: string
examples:
- 019f0593-c378-72f0-84b7-8adf1820207f
'/api/v1/admin/admins/{admin_id}/reactivate':
put:
summary: 'Reactivates a previously deactivated admin account.'
operationId: reactivatesAPreviouslyDeactivatedAdminAccount
description: 'Tokens are not restored — the admin must log in fresh to obtain a new token. * @group Admin API'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Admin reactivated successfully.'
data:
type: object
properties:
id:
type: string
examples:
- 019fd2b7-edab-7280-b09f-b18f58a272ee
name:
type: string
examples:
- 'Super Admin'
email:
type: string
examples:
- office@flexxr.at
role:
type: string
examples:
- super_admin
is_active:
type: boolean
examples:
- true
last_login_at:
type:
- string
- 'null'
examples:
- null
created_at:
type: string
examples:
- '2026-08-05T16:18:17.000000Z'
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 3be88090-98cd-49d7-91f3-780bc1ad10a4
timestamp:
type: string
examples:
- '2026-08-05T16:18:42.902995Z'
examples:
-
status: SUCCESS
message: 'Admin reactivated successfully.'
data:
id: 019fd2b7-edab-7280-b09f-b18f58a272ee
name: 'Super Admin'
email: office@flexxr.at
role: super_admin
is_active: true
last_login_at: null
created_at: '2026-08-05T16:18:17.000000Z'
errors: null
meta:
request_id: 3be88090-98cd-49d7-91f3-780bc1ad10a4
timestamp: '2026-08-05T16:18:42.902995Z'
tags:
- 'Admin API'
parameters:
-
in: path
name: admin_id
description: 'The ID of the admin.'
required: true
schema:
type: string
examples:
- 019f0593-c378-72f0-84b7-8adf1820207f
'/api/v1/admin/admins/{admin_id}/reset-two-factor':
post:
summary: 'Resets (disables) the 2FA setting for a target admin account.'
operationId: resetsdisablesThe2FASettingForATargetAdminAccount
description: "Mirrors the mechanism used by DisableTwoFactorAction: deletes the\nTwoFactorSetting morph record for the target authenticatable. Also\nrevokes all Sanctum tokens so the current session cannot coast on the\n2fa.verified state.\n\nGuards against self-reset — super admins must use the self-service\n\nDELETE /admin/auth/two-factor/disable endpoint instead. * @group Admin API"
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Two-factor authentication reset successfully.'
data:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-29c6-70eb-b55e-61878b3ad363
name:
type: string
examples:
- 'Timothy Goyette I'
email:
type: string
examples:
- klein.jeffrey@example.com
role:
type: string
examples:
- support_agent
is_active:
type: boolean
examples:
- true
last_login_at:
type:
- string
- 'null'
examples:
- null
created_at:
type: string
examples:
- '2026-08-05T16:18:32.000000Z'
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 5b6c0487-98b5-47e0-9beb-af10a7656f0a
timestamp:
type: string
examples:
- '2026-08-05T16:18:42.919563Z'
examples:
-
status: SUCCESS
message: 'Two-factor authentication reset successfully.'
data:
id: 019fd2b8-29c6-70eb-b55e-61878b3ad363
name: 'Timothy Goyette I'
email: klein.jeffrey@example.com
role: support_agent
is_active: true
last_login_at: null
created_at: '2026-08-05T16:18:32.000000Z'
errors: null
meta:
request_id: 5b6c0487-98b5-47e0-9beb-af10a7656f0a
timestamp: '2026-08-05T16:18:42.919563Z'
tags:
- 'Admin API'
parameters:
-
in: path
name: admin_id
description: 'The ID of the admin.'
required: true
schema:
type: string
examples:
- 019f0593-c378-72f0-84b7-8adf1820207f
'/api/v1/admin/admins/{admin_id}/reset-2fa':
post:
summary: 'Resets (disables) the 2FA setting for a target admin account.'
operationId: resetsdisablesThe2FASettingForATargetAdminAccount
description: "Mirrors the mechanism used by DisableTwoFactorAction: deletes the\nTwoFactorSetting morph record for the target authenticatable. Also\nrevokes all Sanctum tokens so the current session cannot coast on the\n2fa.verified state.\n\nGuards against self-reset — super admins must use the self-service\n\nDELETE /admin/auth/two-factor/disable endpoint instead. * @group Admin API"
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Two-factor authentication reset successfully.'
data:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-29c6-70eb-b55e-61878b3ad363
name:
type: string
examples:
- 'Timothy Goyette I'
email:
type: string
examples:
- klein.jeffrey@example.com
role:
type: string
examples:
- support_agent
is_active:
type: boolean
examples:
- true
last_login_at:
type:
- string
- 'null'
examples:
- null
created_at:
type: string
examples:
- '2026-08-05T16:18:32.000000Z'
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 5b6c0487-98b5-47e0-9beb-af10a7656f0a
timestamp:
type: string
examples:
- '2026-08-05T16:18:42.919563Z'
examples:
-
status: SUCCESS
message: 'Two-factor authentication reset successfully.'
data:
id: 019fd2b8-29c6-70eb-b55e-61878b3ad363
name: 'Timothy Goyette I'
email: klein.jeffrey@example.com
role: support_agent
is_active: true
last_login_at: null
created_at: '2026-08-05T16:18:32.000000Z'
errors: null
meta:
request_id: 5b6c0487-98b5-47e0-9beb-af10a7656f0a
timestamp: '2026-08-05T16:18:42.919563Z'
tags:
- 'Admin API'
parameters:
-
in: path
name: admin_id
description: 'The ID of the admin.'
required: true
schema:
type: string
examples:
- 019f0593-c378-72f0-84b7-8adf1820207f
'/api/v1/admin/admins/{admin_id}/presets/scoped':
get:
summary: 'Get Scoped Admin Presets'
operationId: getScopedAdminPresets
description: "Returns the preset keys currently active for a single admin in the given\norganisation context (union of global + org-scoped assignments). Omitting\n`organization_id` returns the same result as the global endpoint."
parameters:
-
in: query
name: organization_id
description: 'optional UUID of the organisation to scope to.'
required: false
schema:
type: string
description: 'optional UUID of the organisation to scope to.'
examples:
- 018f1234-abcd-7000-0000-000000000001
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- Success
data:
type: object
properties:
admin_id:
type: string
examples:
- 019fd2b7-edab-7280-b09f-b18f58a272ee
organization_id:
type: string
examples:
- 019fd2b7-f072-7154-8961-5b324cc6c46c
presets:
type: array
items:
type: string
examples:
-
- super-admin
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- f5f405f3-eeec-4e79-abc8-7b8920e1b156
timestamp:
type: string
examples:
- '2026-08-05T16:18:42.948008Z'
examples:
-
status: SUCCESS
message: Success
data:
admin_id: 019fd2b7-edab-7280-b09f-b18f58a272ee
organization_id: 019fd2b7-f072-7154-8961-5b324cc6c46c
presets:
- super-admin
errors: null
meta:
request_id: f5f405f3-eeec-4e79-abc8-7b8920e1b156
timestamp: '2026-08-05T16:18:42.948008Z'
tags:
- 'Admin API'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
organization_id:
type:
- string
- 'null'
description: 'Must be a valid UUID. Must match an existing stored value.'
examples:
- 6ff8f7f6-1eb3-3525-be4a-3932c805afed
put:
summary: 'Update Scoped Admin Presets'
operationId: updateScopedAdminPresets
description: "Bulk-replaces the org-scoped preset assignments for an admin. Only rows\nmatching the supplied `organization_id` context are diffed; global\nassignments are never touched. Presets absent from the request body are\nrevoked (soft); new ones are assigned. The diff and writes run inside a\nsingle DB transaction.\n\nRequired permission: `admin.admins.manage` (super-admin only by default)."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Scoped admin presets updated.'
data:
type: object
properties:
admin_id:
type: string
examples:
- 019fd2b7-edab-7280-b09f-b18f58a272ee
organization_id:
type: string
examples:
- 019fd2b7-f072-7154-8961-5b324cc6c46c
presets:
type: array
items:
type: string
examples:
-
- super-admin
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- dc0fa735-54c1-46d5-9457-cc38dd13b0e1
timestamp:
type: string
examples:
- '2026-08-05T16:18:42.969201Z'
examples:
-
status: SUCCESS
message: 'Scoped admin presets updated.'
data:
admin_id: 019fd2b7-edab-7280-b09f-b18f58a272ee
organization_id: 019fd2b7-f072-7154-8961-5b324cc6c46c
presets:
- super-admin
errors: null
meta:
request_id: dc0fa735-54c1-46d5-9457-cc38dd13b0e1
timestamp: '2026-08-05T16:18:42.969201Z'
422:
description: ''
content:
application/json:
schema:
oneOf:
-
description: 'Unknown preset'
type: object
properties:
status:
type: string
examples:
- VALIDATION_ERROR
message:
type: string
examples:
- "Unknown preset 'foo'."
examples:
-
status: VALIDATION_ERROR
message: "Unknown preset 'foo'."
-
description: 'Out of scope'
type: object
properties:
status:
type: string
examples:
- VALIDATION_ERROR
message:
type: string
examples:
- "Unknown preset 'co-admin'."
examples:
-
status: VALIDATION_ERROR
message: "Unknown preset 'co-admin'."
tags:
- 'Admin API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
organization_id:
type: string
description: 'UUID of the organisation to scope to.'
examples:
- 018f1234-abcd-7000-0000-000000000001
presets:
type: array
description: 'List of admin preset keys scoped to this org. Pass [] to revoke all scoped presets.'
items:
type: string
examples:
-
- admin
- admin-finance
required:
- organization_id
- presets
parameters:
-
in: path
name: admin_id
description: 'The ID of the admin.'
required: true
schema:
type: string
examples:
- 019f0593-c378-72f0-84b7-8adf1820207f
'/api/v1/admin/admins/{admin_id}/presets':
get:
summary: 'Get Admin Presets'
operationId: getAdminPresets
description: "Returns the preset keys currently assigned to a single admin.\nUsed by the \"Manage roles\" dialog to pre-check the right boxes."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- Success
data:
type: object
properties:
admin_id:
type: string
examples:
- 019fd2b7-edab-7280-b09f-b18f58a272ee
presets:
type: array
items:
type: string
examples:
-
- super-admin
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- e65c3abe-ffe9-4fee-8269-dea01f566b5b
timestamp:
type: string
examples:
- '2026-08-05T16:18:42.981025Z'
examples:
-
status: SUCCESS
message: Success
data:
admin_id: 019fd2b7-edab-7280-b09f-b18f58a272ee
presets:
- super-admin
errors: null
meta:
request_id: e65c3abe-ffe9-4fee-8269-dea01f566b5b
timestamp: '2026-08-05T16:18:42.981025Z'
tags:
- 'Admin API'
put:
summary: 'Update Admin Presets'
operationId: updateAdminPresets
description: "Bulk-replaces the presets assigned to an admin. Presets currently\nheld but absent from the request body are revoked; presets in the\nrequest body but not yet held are added. The diff and the assign /\nrevoke writes execute inside a single transaction so a partial\nfailure cannot leave the actor with a half-updated preset set.\n\nRequired permission: `admin.admins.manage` (super-admin only by default)."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Admin presets updated.'
data:
type: object
properties:
admin_id:
type: string
examples:
- 019fd2b7-edab-7280-b09f-b18f58a272ee
presets:
type: array
items:
type: string
examples:
-
- super-admin
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 8204b89c-9e5a-4051-b179-15d96a9f9b75
timestamp:
type: string
examples:
- '2026-08-05T16:18:42.991244Z'
examples:
-
status: SUCCESS
message: 'Admin presets updated.'
data:
admin_id: 019fd2b7-edab-7280-b09f-b18f58a272ee
presets:
- super-admin
errors: null
meta:
request_id: 8204b89c-9e5a-4051-b179-15d96a9f9b75
timestamp: '2026-08-05T16:18:42.991244Z'
422:
description: 'Unknown preset'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- VALIDATION_ERROR
message:
type: string
examples:
- "Unknown preset 'foo'."
examples:
-
status: VALIDATION_ERROR
message: "Unknown preset 'foo'."
tags:
- 'Admin API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
presets:
type: array
description: 'List of admin preset keys. Pass [] to revoke all.'
items:
type: string
examples:
-
- admin
- admin-finance
required:
- presets
parameters:
-
in: path
name: admin_id
description: 'The ID of the admin.'
required: true
schema:
type: string
examples:
- 019f0593-c378-72f0-84b7-8adf1820207f
'/api/v1/admin/admins/{admin_id}/scoped-presets':
get:
summary: 'Get Scoped Admin Presets'
operationId: getScopedAdminPresets
description: "Returns the preset keys currently active for a single admin in the given\norganisation context (union of global + org-scoped assignments). Omitting\n`organization_id` returns the same result as the global endpoint."
parameters:
-
in: query
name: organization_id
description: 'optional UUID of the organisation to scope to.'
required: false
schema:
type: string
description: 'optional UUID of the organisation to scope to.'
examples:
- 018f1234-abcd-7000-0000-000000000001
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- Success
data:
type: object
properties:
admin_id:
type: string
examples:
- 019fd2b7-edab-7280-b09f-b18f58a272ee
organization_id:
type: string
examples:
- 019fd2b7-f072-7154-8961-5b324cc6c46c
presets:
type: array
items:
type: string
examples:
-
- super-admin
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- f5f405f3-eeec-4e79-abc8-7b8920e1b156
timestamp:
type: string
examples:
- '2026-08-05T16:18:42.948008Z'
examples:
-
status: SUCCESS
message: Success
data:
admin_id: 019fd2b7-edab-7280-b09f-b18f58a272ee
organization_id: 019fd2b7-f072-7154-8961-5b324cc6c46c
presets:
- super-admin
errors: null
meta:
request_id: f5f405f3-eeec-4e79-abc8-7b8920e1b156
timestamp: '2026-08-05T16:18:42.948008Z'
tags:
- 'Admin API'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
organization_id:
type:
- string
- 'null'
description: 'Must be a valid UUID. Must match an existing stored value.'
examples:
- 6ff8f7f6-1eb3-3525-be4a-3932c805afed
put:
summary: 'Update Scoped Admin Presets'
operationId: updateScopedAdminPresets
description: "Bulk-replaces the org-scoped preset assignments for an admin. Only rows\nmatching the supplied `organization_id` context are diffed; global\nassignments are never touched. Presets absent from the request body are\nrevoked (soft); new ones are assigned. The diff and writes run inside a\nsingle DB transaction.\n\nRequired permission: `admin.admins.manage` (super-admin only by default)."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Scoped admin presets updated.'
data:
type: object
properties:
admin_id:
type: string
examples:
- 019fd2b7-edab-7280-b09f-b18f58a272ee
organization_id:
type: string
examples:
- 019fd2b7-f072-7154-8961-5b324cc6c46c
presets:
type: array
items:
type: string
examples:
-
- super-admin
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- dc0fa735-54c1-46d5-9457-cc38dd13b0e1
timestamp:
type: string
examples:
- '2026-08-05T16:18:42.969201Z'
examples:
-
status: SUCCESS
message: 'Scoped admin presets updated.'
data:
admin_id: 019fd2b7-edab-7280-b09f-b18f58a272ee
organization_id: 019fd2b7-f072-7154-8961-5b324cc6c46c
presets:
- super-admin
errors: null
meta:
request_id: dc0fa735-54c1-46d5-9457-cc38dd13b0e1
timestamp: '2026-08-05T16:18:42.969201Z'
422:
description: ''
content:
application/json:
schema:
oneOf:
-
description: 'Unknown preset'
type: object
properties:
status:
type: string
examples:
- VALIDATION_ERROR
message:
type: string
examples:
- "Unknown preset 'foo'."
examples:
-
status: VALIDATION_ERROR
message: "Unknown preset 'foo'."
-
description: 'Out of scope'
type: object
properties:
status:
type: string
examples:
- VALIDATION_ERROR
message:
type: string
examples:
- "Unknown preset 'co-admin'."
examples:
-
status: VALIDATION_ERROR
message: "Unknown preset 'co-admin'."
tags:
- 'Admin API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
organization_id:
type: string
description: 'UUID of the organisation to scope to.'
examples:
- 018f1234-abcd-7000-0000-000000000001
presets:
type: array
description: 'List of admin preset keys scoped to this org. Pass [] to revoke all scoped presets.'
items:
type: string
examples:
-
- admin
- admin-finance
required:
- organization_id
- presets
parameters:
-
in: path
name: admin_id
description: 'The ID of the admin.'
required: true
schema:
type: string
examples:
- 019f0593-c378-72f0-84b7-8adf1820207f
/api/v1/admin/admin-presets:
get:
summary: 'List Admin Presets'
operationId: listAdminPresets
description: "Returns the catalog of admin-scope presets (roles) that a super admin\nmay assign to other admin accounts. Used by the admin dashboard's\n\"Manage roles\" dialog."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- Success
data:
type: array
items:
type: object
properties:
key:
type: string
examples:
- super-admin
label:
type: string
examples:
- 'Super Admin'
description:
type: string
examples:
- 'Unrestricted admin access including GDPR operations, app secrets, and admin account management.'
permissions:
type: array
items:
type: string
examples:
-
- admin.admins.create
- admin.admins.deactivate
- admin.admins.reactivate
- admin.admins.reset-2fa
- admin.admins.update
- admin.admins.update-presets
- admin.admins.update-role
- admin.admins.view
- admin.app-settings.reveal-secret
- admin.app-settings.update
- admin.app-settings.view
- admin.assignments.manage
- admin.assignments.view
- admin.audit.view
- admin.billing.update
- admin.billing.view
- admin.compliance.aueg-monitor
- admin.compliance.minimum-wage-warnings
- admin.compliance.view
- admin.compliance.working-time-warnings
- admin.contracts.manage
- admin.contracts.view
- admin.employees.approve
- admin.employees.flag-high-risk
- admin.employees.reactivate
- admin.employees.reject
- admin.employees.request-correction
- admin.employees.review-documents
- admin.employees.suspend
- admin.employees.validate-svs
- admin.employees.view
- admin.finance.manage-dunning
- admin.finance.manage-invoices
- admin.finance.view-invoices
- admin.finance.view-payments
- admin.gdpr.anonymize
- admin.gdpr.export
- admin.gdpr.restrict
- admin.jobs.approve
- admin.jobs.emergency-close
- admin.jobs.emergency-reassign
- admin.jobs.manage-categories
- admin.jobs.manage-document-types
- admin.jobs.reject
- admin.jobs.view
- admin.legal.manage
- admin.legal.view
- admin.organizations.reactivate
- admin.organizations.reject
- admin.organizations.reset-password
- admin.organizations.review-documents
- admin.organizations.suspend
- admin.organizations.update
- admin.organizations.verify
- admin.organizations.view
- admin.payroll.download-payslips
- admin.payroll.sync
- admin.payroll.trigger
- admin.payroll.view
- admin.ratings.moderate
- admin.ratings.view
- admin.reports.export
- admin.reports.view
- admin.security.detect-duplicates
- admin.security.manual-review
- admin.support.assign-tickets
- admin.support.escalate-tickets
- admin.support.resolve-tickets
- admin.support.update
- admin.support.view
- admin.support.view-tickets
- admin.system.view-health
- admin.system.view-metrics
- admin.users.change-status
- admin.users.reset-password
- admin.users.update
- admin.users.update-by-admin
- admin.users.view
category:
type: string
examples:
- platform_admin
highlights:
type: array
items:
type: string
examples:
-
- presets.super-admin.highlights.full_access
- presets.super-admin.highlights.manage_admins
- presets.super-admin.highlights.platform_settings
risk_level:
type: string
examples:
- high
examples:
-
-
key: super-admin
label: 'Super Admin'
description: 'Unrestricted admin access including GDPR operations, app secrets, and admin account management.'
permissions:
- admin.admins.create
- admin.admins.deactivate
- admin.admins.reactivate
- admin.admins.reset-2fa
- admin.admins.update
- admin.admins.update-presets
- admin.admins.update-role
- admin.admins.view
- admin.app-settings.reveal-secret
- admin.app-settings.update
- admin.app-settings.view
- admin.assignments.manage
- admin.assignments.view
- admin.audit.view
- admin.billing.update
- admin.billing.view
- admin.compliance.aueg-monitor
- admin.compliance.minimum-wage-warnings
- admin.compliance.view
- admin.compliance.working-time-warnings
- admin.contracts.manage
- admin.contracts.view
- admin.employees.approve
- admin.employees.flag-high-risk
- admin.employees.reactivate
- admin.employees.reject
- admin.employees.request-correction
- admin.employees.review-documents
- admin.employees.suspend
- admin.employees.validate-svs
- admin.employees.view
- admin.finance.manage-dunning
- admin.finance.manage-invoices
- admin.finance.view-invoices
- admin.finance.view-payments
- admin.gdpr.anonymize
- admin.gdpr.export
- admin.gdpr.restrict
- admin.jobs.approve
- admin.jobs.emergency-close
- admin.jobs.emergency-reassign
- admin.jobs.manage-categories
- admin.jobs.manage-document-types
- admin.jobs.reject
- admin.jobs.view
- admin.legal.manage
- admin.legal.view
- admin.organizations.reactivate
- admin.organizations.reject
- admin.organizations.reset-password
- admin.organizations.review-documents
- admin.organizations.suspend
- admin.organizations.update
- admin.organizations.verify
- admin.organizations.view
- admin.payroll.download-payslips
- admin.payroll.sync
- admin.payroll.trigger
- admin.payroll.view
- admin.ratings.moderate
- admin.ratings.view
- admin.reports.export
- admin.reports.view
- admin.security.detect-duplicates
- admin.security.manual-review
- admin.support.assign-tickets
- admin.support.escalate-tickets
- admin.support.resolve-tickets
- admin.support.update
- admin.support.view
- admin.support.view-tickets
- admin.system.view-health
- admin.system.view-metrics
- admin.users.change-status
- admin.users.reset-password
- admin.users.update
- admin.users.update-by-admin
- admin.users.view
category: platform_admin
highlights:
- presets.super-admin.highlights.full_access
- presets.super-admin.highlights.manage_admins
- presets.super-admin.highlights.platform_settings
risk_level: high
-
key: payroll-admin
label: 'Payroll Admin'
description: 'Manage payroll calculations, payslip generation, and ELDA submissions.'
permissions:
- admin.contracts.view
- admin.employees.view
- admin.payroll.download-payslips
- admin.payroll.sync
- admin.payroll.trigger
- admin.payroll.view
- admin.reports.view
category: null
highlights: []
risk_level: null
-
key: compliance-officer
label: 'Compliance Officer'
description: 'Employee/company document review, compliance monitoring (AÜG/AZG/ARG), audit log access.'
permissions:
- admin.audit.view
- admin.compliance.aueg-monitor
- admin.compliance.minimum-wage-warnings
- admin.compliance.view
- admin.compliance.working-time-warnings
- admin.employees.approve
- admin.employees.flag-high-risk
- admin.employees.reactivate
- admin.employees.reject
- admin.employees.request-correction
- admin.employees.review-documents
- admin.employees.suspend
- admin.employees.validate-svs
- admin.employees.view
- admin.legal.manage
- admin.legal.view
- admin.organizations.reject
- admin.organizations.review-documents
- admin.organizations.verify
- admin.organizations.view
- admin.reports.view
- admin.security.detect-duplicates
- admin.security.manual-review
category: null
highlights: []
risk_level: null
-
key: operations-manager
label: 'Operations Manager'
description: 'Platform operations: employee/company review, support tickets, system health monitoring.'
permissions:
- admin.assignments.manage
- admin.assignments.view
- admin.employees.approve
- admin.employees.reject
- admin.employees.request-correction
- admin.employees.review-documents
- admin.employees.view
- admin.jobs.approve
- admin.jobs.emergency-close
- admin.jobs.emergency-reassign
- admin.jobs.manage-categories
- admin.jobs.manage-document-types
- admin.jobs.reject
- admin.jobs.view
- admin.organizations.reject
- admin.organizations.review-documents
- admin.organizations.verify
- admin.organizations.view
- admin.reports.view
- admin.support.assign-tickets
- admin.support.escalate-tickets
- admin.support.resolve-tickets
- admin.support.update
- admin.support.view
- admin.support.view-tickets
- admin.system.view-health
- admin.system.view-metrics
category: null
highlights: []
risk_level: null
-
key: finance-admin
label: 'Finance Admin'
description: 'Manage invoices, payments, and dunning processes.'
permissions:
- admin.billing.update
- admin.billing.view
- admin.finance.manage-dunning
- admin.finance.manage-invoices
- admin.finance.view-invoices
- admin.finance.view-payments
- admin.reports.export
- admin.reports.view
category: null
highlights: []
risk_level: null
-
key: payroll-agent
label: 'Payroll Agent'
description: 'View payroll status and download payslips. Cannot trigger runs or sync.'
permissions:
- admin.employees.view
- admin.payroll.download-payslips
- admin.payroll.view
- admin.reports.view
category: null
highlights: []
risk_level: null
-
key: compliance-agent
label: 'Compliance Agent'
description: 'Monitor AZG/ARG warnings and review documents. Cannot verify/reject organisations.'
permissions:
- admin.audit.view
- admin.compliance.minimum-wage-warnings
- admin.compliance.view
- admin.compliance.working-time-warnings
- admin.employees.review-documents
- admin.employees.view
- admin.organizations.view
category: null
highlights: []
risk_level: null
-
key: support-supervisor
label: 'Support Supervisor'
description: 'Full support-ticket control including assignment and escalation.'
permissions:
- admin.employees.view
- admin.organizations.view
- admin.reports.view
- admin.support.assign-tickets
- admin.support.escalate-tickets
- admin.support.resolve-tickets
- admin.support.update
- admin.support.view
- admin.support.view-tickets
- admin.users.view
category: null
highlights: []
risk_level: null
-
key: ops-agent
label: 'Operations Agent'
description: 'Review employee/company applications and monitor jobs. Cannot approve or reject.'
permissions:
- admin.assignments.view
- admin.employees.review-documents
- admin.employees.view
- admin.jobs.view
- admin.organizations.review-documents
- admin.organizations.view
category: null
highlights: []
risk_level: null
-
key: finance-agent
label: 'Finance Agent'
description: 'View invoices and payments. Cannot finalize invoices or manage dunning.'
permissions:
- admin.billing.view
- admin.finance.view-invoices
- admin.finance.view-payments
- admin.reports.view
category: null
highlights: []
risk_level: null
-
key: support-agent
label: 'Support Agent'
description: 'Handle support tickets, view user and organization information for context.'
permissions:
- admin.employees.view
- admin.organizations.view
- admin.support.resolve-tickets
- admin.support.update
- admin.support.view
- admin.support.view-tickets
- admin.users.view
category: null
highlights: []
risk_level: null
-
key: admin
label: Admin
description: 'Standard admin: org/user management, audit log, settings. Use SRS roles instead.'
permissions:
- admin.admins.view
- admin.app-settings.update
- admin.app-settings.view
- admin.audit.view
- admin.employees.approve
- admin.employees.flag-high-risk
- admin.employees.reactivate
- admin.employees.reject
- admin.employees.request-correction
- admin.employees.review-documents
- admin.employees.suspend
- admin.employees.validate-svs
- admin.employees.view
- admin.organizations.reactivate
- admin.organizations.reject
- admin.organizations.reset-password
- admin.organizations.review-documents
- admin.organizations.suspend
- admin.organizations.update
- admin.organizations.verify
- admin.organizations.view
- admin.reports.view
- admin.users.change-status
- admin.users.reset-password
- admin.users.update
- admin.users.update-by-admin
- admin.users.view
category: platform_admin
highlights:
- presets.admin.highlights.review_orgs
- presets.admin.highlights.moderate_campaigns
- presets.admin.highlights.approve_payouts
- presets.admin.highlights.no_admin_management
risk_level: high
-
key: moderator
label: Moderator
description: 'Read-only: view organisations, users, audit log. Use "support-agent" instead.'
permissions:
- admin.audit.view
- admin.employees.view
- admin.organizations.view
- admin.users.view
category: content
highlights:
- presets.moderator.highlights.view_organizations
- presets.moderator.highlights.view_users
- presets.moderator.highlights.no_money_actions
risk_level: medium
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 2762271f-0d07-4368-802a-e50e0d9f8403
timestamp:
type: string
examples:
- '2026-08-05T16:18:43.032923Z'
examples:
-
status: SUCCESS
message: Success
data:
-
key: super-admin
label: 'Super Admin'
description: 'Unrestricted admin access including GDPR operations, app secrets, and admin account management.'
permissions:
- admin.admins.create
- admin.admins.deactivate
- admin.admins.reactivate
- admin.admins.reset-2fa
- admin.admins.update
- admin.admins.update-presets
- admin.admins.update-role
- admin.admins.view
- admin.app-settings.reveal-secret
- admin.app-settings.update
- admin.app-settings.view
- admin.assignments.manage
- admin.assignments.view
- admin.audit.view
- admin.billing.update
- admin.billing.view
- admin.compliance.aueg-monitor
- admin.compliance.minimum-wage-warnings
- admin.compliance.view
- admin.compliance.working-time-warnings
- admin.contracts.manage
- admin.contracts.view
- admin.employees.approve
- admin.employees.flag-high-risk
- admin.employees.reactivate
- admin.employees.reject
- admin.employees.request-correction
- admin.employees.review-documents
- admin.employees.suspend
- admin.employees.validate-svs
- admin.employees.view
- admin.finance.manage-dunning
- admin.finance.manage-invoices
- admin.finance.view-invoices
- admin.finance.view-payments
- admin.gdpr.anonymize
- admin.gdpr.export
- admin.gdpr.restrict
- admin.jobs.approve
- admin.jobs.emergency-close
- admin.jobs.emergency-reassign
- admin.jobs.manage-categories
- admin.jobs.manage-document-types
- admin.jobs.reject
- admin.jobs.view
- admin.legal.manage
- admin.legal.view
- admin.organizations.reactivate
- admin.organizations.reject
- admin.organizations.reset-password
- admin.organizations.review-documents
- admin.organizations.suspend
- admin.organizations.update
- admin.organizations.verify
- admin.organizations.view
- admin.payroll.download-payslips
- admin.payroll.sync
- admin.payroll.trigger
- admin.payroll.view
- admin.ratings.moderate
- admin.ratings.view
- admin.reports.export
- admin.reports.view
- admin.security.detect-duplicates
- admin.security.manual-review
- admin.support.assign-tickets
- admin.support.escalate-tickets
- admin.support.resolve-tickets
- admin.support.update
- admin.support.view
- admin.support.view-tickets
- admin.system.view-health
- admin.system.view-metrics
- admin.users.change-status
- admin.users.reset-password
- admin.users.update
- admin.users.update-by-admin
- admin.users.view
category: platform_admin
highlights:
- presets.super-admin.highlights.full_access
- presets.super-admin.highlights.manage_admins
- presets.super-admin.highlights.platform_settings
risk_level: high
-
key: payroll-admin
label: 'Payroll Admin'
description: 'Manage payroll calculations, payslip generation, and ELDA submissions.'
permissions:
- admin.contracts.view
- admin.employees.view
- admin.payroll.download-payslips
- admin.payroll.sync
- admin.payroll.trigger
- admin.payroll.view
- admin.reports.view
category: null
highlights: []
risk_level: null
-
key: compliance-officer
label: 'Compliance Officer'
description: 'Employee/company document review, compliance monitoring (AÜG/AZG/ARG), audit log access.'
permissions:
- admin.audit.view
- admin.compliance.aueg-monitor
- admin.compliance.minimum-wage-warnings
- admin.compliance.view
- admin.compliance.working-time-warnings
- admin.employees.approve
- admin.employees.flag-high-risk
- admin.employees.reactivate
- admin.employees.reject
- admin.employees.request-correction
- admin.employees.review-documents
- admin.employees.suspend
- admin.employees.validate-svs
- admin.employees.view
- admin.legal.manage
- admin.legal.view
- admin.organizations.reject
- admin.organizations.review-documents
- admin.organizations.verify
- admin.organizations.view
- admin.reports.view
- admin.security.detect-duplicates
- admin.security.manual-review
category: null
highlights: []
risk_level: null
-
key: operations-manager
label: 'Operations Manager'
description: 'Platform operations: employee/company review, support tickets, system health monitoring.'
permissions:
- admin.assignments.manage
- admin.assignments.view
- admin.employees.approve
- admin.employees.reject
- admin.employees.request-correction
- admin.employees.review-documents
- admin.employees.view
- admin.jobs.approve
- admin.jobs.emergency-close
- admin.jobs.emergency-reassign
- admin.jobs.manage-categories
- admin.jobs.manage-document-types
- admin.jobs.reject
- admin.jobs.view
- admin.organizations.reject
- admin.organizations.review-documents
- admin.organizations.verify
- admin.organizations.view
- admin.reports.view
- admin.support.assign-tickets
- admin.support.escalate-tickets
- admin.support.resolve-tickets
- admin.support.update
- admin.support.view
- admin.support.view-tickets
- admin.system.view-health
- admin.system.view-metrics
category: null
highlights: []
risk_level: null
-
key: finance-admin
label: 'Finance Admin'
description: 'Manage invoices, payments, and dunning processes.'
permissions:
- admin.billing.update
- admin.billing.view
- admin.finance.manage-dunning
- admin.finance.manage-invoices
- admin.finance.view-invoices
- admin.finance.view-payments
- admin.reports.export
- admin.reports.view
category: null
highlights: []
risk_level: null
-
key: payroll-agent
label: 'Payroll Agent'
description: 'View payroll status and download payslips. Cannot trigger runs or sync.'
permissions:
- admin.employees.view
- admin.payroll.download-payslips
- admin.payroll.view
- admin.reports.view
category: null
highlights: []
risk_level: null
-
key: compliance-agent
label: 'Compliance Agent'
description: 'Monitor AZG/ARG warnings and review documents. Cannot verify/reject organisations.'
permissions:
- admin.audit.view
- admin.compliance.minimum-wage-warnings
- admin.compliance.view
- admin.compliance.working-time-warnings
- admin.employees.review-documents
- admin.employees.view
- admin.organizations.view
category: null
highlights: []
risk_level: null
-
key: support-supervisor
label: 'Support Supervisor'
description: 'Full support-ticket control including assignment and escalation.'
permissions:
- admin.employees.view
- admin.organizations.view
- admin.reports.view
- admin.support.assign-tickets
- admin.support.escalate-tickets
- admin.support.resolve-tickets
- admin.support.update
- admin.support.view
- admin.support.view-tickets
- admin.users.view
category: null
highlights: []
risk_level: null
-
key: ops-agent
label: 'Operations Agent'
description: 'Review employee/company applications and monitor jobs. Cannot approve or reject.'
permissions:
- admin.assignments.view
- admin.employees.review-documents
- admin.employees.view
- admin.jobs.view
- admin.organizations.review-documents
- admin.organizations.view
category: null
highlights: []
risk_level: null
-
key: finance-agent
label: 'Finance Agent'
description: 'View invoices and payments. Cannot finalize invoices or manage dunning.'
permissions:
- admin.billing.view
- admin.finance.view-invoices
- admin.finance.view-payments
- admin.reports.view
category: null
highlights: []
risk_level: null
-
key: support-agent
label: 'Support Agent'
description: 'Handle support tickets, view user and organization information for context.'
permissions:
- admin.employees.view
- admin.organizations.view
- admin.support.resolve-tickets
- admin.support.update
- admin.support.view
- admin.support.view-tickets
- admin.users.view
category: null
highlights: []
risk_level: null
-
key: admin
label: Admin
description: 'Standard admin: org/user management, audit log, settings. Use SRS roles instead.'
permissions:
- admin.admins.view
- admin.app-settings.update
- admin.app-settings.view
- admin.audit.view
- admin.employees.approve
- admin.employees.flag-high-risk
- admin.employees.reactivate
- admin.employees.reject
- admin.employees.request-correction
- admin.employees.review-documents
- admin.employees.suspend
- admin.employees.validate-svs
- admin.employees.view
- admin.organizations.reactivate
- admin.organizations.reject
- admin.organizations.reset-password
- admin.organizations.review-documents
- admin.organizations.suspend
- admin.organizations.update
- admin.organizations.verify
- admin.organizations.view
- admin.reports.view
- admin.users.change-status
- admin.users.reset-password
- admin.users.update
- admin.users.update-by-admin
- admin.users.view
category: platform_admin
highlights:
- presets.admin.highlights.review_orgs
- presets.admin.highlights.moderate_campaigns
- presets.admin.highlights.approve_payouts
- presets.admin.highlights.no_admin_management
risk_level: high
-
key: moderator
label: Moderator
description: 'Read-only: view organisations, users, audit log. Use "support-agent" instead.'
permissions:
- admin.audit.view
- admin.employees.view
- admin.organizations.view
- admin.users.view
category: content
highlights:
- presets.moderator.highlights.view_organizations
- presets.moderator.highlights.view_users
- presets.moderator.highlights.no_money_actions
risk_level: medium
errors: null
meta:
request_id: 2762271f-0d07-4368-802a-e50e0d9f8403
timestamp: '2026-08-05T16:18:43.032923Z'
tags:
- 'Admin API'
/api/v1/admin/acl/presets:
get:
summary: 'List Admin Presets'
operationId: listAdminPresets
description: "Returns the catalog of admin-scope presets (roles) that a super admin\nmay assign to other admin accounts. Used by the admin dashboard's\n\"Manage roles\" dialog."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- Success
data:
type: array
items:
type: object
properties:
key:
type: string
examples:
- super-admin
label:
type: string
examples:
- 'Super Admin'
description:
type: string
examples:
- 'Unrestricted admin access including GDPR operations, app secrets, and admin account management.'
permissions:
type: array
items:
type: string
examples:
-
- admin.admins.create
- admin.admins.deactivate
- admin.admins.reactivate
- admin.admins.reset-2fa
- admin.admins.update
- admin.admins.update-presets
- admin.admins.update-role
- admin.admins.view
- admin.app-settings.reveal-secret
- admin.app-settings.update
- admin.app-settings.view
- admin.assignments.manage
- admin.assignments.view
- admin.audit.view
- admin.billing.update
- admin.billing.view
- admin.compliance.aueg-monitor
- admin.compliance.minimum-wage-warnings
- admin.compliance.view
- admin.compliance.working-time-warnings
- admin.contracts.manage
- admin.contracts.view
- admin.employees.approve
- admin.employees.flag-high-risk
- admin.employees.reactivate
- admin.employees.reject
- admin.employees.request-correction
- admin.employees.review-documents
- admin.employees.suspend
- admin.employees.validate-svs
- admin.employees.view
- admin.finance.manage-dunning
- admin.finance.manage-invoices
- admin.finance.view-invoices
- admin.finance.view-payments
- admin.gdpr.anonymize
- admin.gdpr.export
- admin.gdpr.restrict
- admin.jobs.approve
- admin.jobs.emergency-close
- admin.jobs.emergency-reassign
- admin.jobs.manage-categories
- admin.jobs.manage-document-types
- admin.jobs.reject
- admin.jobs.view
- admin.legal.manage
- admin.legal.view
- admin.organizations.reactivate
- admin.organizations.reject
- admin.organizations.reset-password
- admin.organizations.review-documents
- admin.organizations.suspend
- admin.organizations.update
- admin.organizations.verify
- admin.organizations.view
- admin.payroll.download-payslips
- admin.payroll.sync
- admin.payroll.trigger
- admin.payroll.view
- admin.ratings.moderate
- admin.ratings.view
- admin.reports.export
- admin.reports.view
- admin.security.detect-duplicates
- admin.security.manual-review
- admin.support.assign-tickets
- admin.support.escalate-tickets
- admin.support.resolve-tickets
- admin.support.update
- admin.support.view
- admin.support.view-tickets
- admin.system.view-health
- admin.system.view-metrics
- admin.users.change-status
- admin.users.reset-password
- admin.users.update
- admin.users.update-by-admin
- admin.users.view
category:
type: string
examples:
- platform_admin
highlights:
type: array
items:
type: string
examples:
-
- presets.super-admin.highlights.full_access
- presets.super-admin.highlights.manage_admins
- presets.super-admin.highlights.platform_settings
risk_level:
type: string
examples:
- high
examples:
-
-
key: super-admin
label: 'Super Admin'
description: 'Unrestricted admin access including GDPR operations, app secrets, and admin account management.'
permissions:
- admin.admins.create
- admin.admins.deactivate
- admin.admins.reactivate
- admin.admins.reset-2fa
- admin.admins.update
- admin.admins.update-presets
- admin.admins.update-role
- admin.admins.view
- admin.app-settings.reveal-secret
- admin.app-settings.update
- admin.app-settings.view
- admin.assignments.manage
- admin.assignments.view
- admin.audit.view
- admin.billing.update
- admin.billing.view
- admin.compliance.aueg-monitor
- admin.compliance.minimum-wage-warnings
- admin.compliance.view
- admin.compliance.working-time-warnings
- admin.contracts.manage
- admin.contracts.view
- admin.employees.approve
- admin.employees.flag-high-risk
- admin.employees.reactivate
- admin.employees.reject
- admin.employees.request-correction
- admin.employees.review-documents
- admin.employees.suspend
- admin.employees.validate-svs
- admin.employees.view
- admin.finance.manage-dunning
- admin.finance.manage-invoices
- admin.finance.view-invoices
- admin.finance.view-payments
- admin.gdpr.anonymize
- admin.gdpr.export
- admin.gdpr.restrict
- admin.jobs.approve
- admin.jobs.emergency-close
- admin.jobs.emergency-reassign
- admin.jobs.manage-categories
- admin.jobs.manage-document-types
- admin.jobs.reject
- admin.jobs.view
- admin.legal.manage
- admin.legal.view
- admin.organizations.reactivate
- admin.organizations.reject
- admin.organizations.reset-password
- admin.organizations.review-documents
- admin.organizations.suspend
- admin.organizations.update
- admin.organizations.verify
- admin.organizations.view
- admin.payroll.download-payslips
- admin.payroll.sync
- admin.payroll.trigger
- admin.payroll.view
- admin.ratings.moderate
- admin.ratings.view
- admin.reports.export
- admin.reports.view
- admin.security.detect-duplicates
- admin.security.manual-review
- admin.support.assign-tickets
- admin.support.escalate-tickets
- admin.support.resolve-tickets
- admin.support.update
- admin.support.view
- admin.support.view-tickets
- admin.system.view-health
- admin.system.view-metrics
- admin.users.change-status
- admin.users.reset-password
- admin.users.update
- admin.users.update-by-admin
- admin.users.view
category: platform_admin
highlights:
- presets.super-admin.highlights.full_access
- presets.super-admin.highlights.manage_admins
- presets.super-admin.highlights.platform_settings
risk_level: high
-
key: payroll-admin
label: 'Payroll Admin'
description: 'Manage payroll calculations, payslip generation, and ELDA submissions.'
permissions:
- admin.contracts.view
- admin.employees.view
- admin.payroll.download-payslips
- admin.payroll.sync
- admin.payroll.trigger
- admin.payroll.view
- admin.reports.view
category: null
highlights: []
risk_level: null
-
key: compliance-officer
label: 'Compliance Officer'
description: 'Employee/company document review, compliance monitoring (AÜG/AZG/ARG), audit log access.'
permissions:
- admin.audit.view
- admin.compliance.aueg-monitor
- admin.compliance.minimum-wage-warnings
- admin.compliance.view
- admin.compliance.working-time-warnings
- admin.employees.approve
- admin.employees.flag-high-risk
- admin.employees.reactivate
- admin.employees.reject
- admin.employees.request-correction
- admin.employees.review-documents
- admin.employees.suspend
- admin.employees.validate-svs
- admin.employees.view
- admin.legal.manage
- admin.legal.view
- admin.organizations.reject
- admin.organizations.review-documents
- admin.organizations.verify
- admin.organizations.view
- admin.reports.view
- admin.security.detect-duplicates
- admin.security.manual-review
category: null
highlights: []
risk_level: null
-
key: operations-manager
label: 'Operations Manager'
description: 'Platform operations: employee/company review, support tickets, system health monitoring.'
permissions:
- admin.assignments.manage
- admin.assignments.view
- admin.employees.approve
- admin.employees.reject
- admin.employees.request-correction
- admin.employees.review-documents
- admin.employees.view
- admin.jobs.approve
- admin.jobs.emergency-close
- admin.jobs.emergency-reassign
- admin.jobs.manage-categories
- admin.jobs.manage-document-types
- admin.jobs.reject
- admin.jobs.view
- admin.organizations.reject
- admin.organizations.review-documents
- admin.organizations.verify
- admin.organizations.view
- admin.reports.view
- admin.support.assign-tickets
- admin.support.escalate-tickets
- admin.support.resolve-tickets
- admin.support.update
- admin.support.view
- admin.support.view-tickets
- admin.system.view-health
- admin.system.view-metrics
category: null
highlights: []
risk_level: null
-
key: finance-admin
label: 'Finance Admin'
description: 'Manage invoices, payments, and dunning processes.'
permissions:
- admin.billing.update
- admin.billing.view
- admin.finance.manage-dunning
- admin.finance.manage-invoices
- admin.finance.view-invoices
- admin.finance.view-payments
- admin.reports.export
- admin.reports.view
category: null
highlights: []
risk_level: null
-
key: payroll-agent
label: 'Payroll Agent'
description: 'View payroll status and download payslips. Cannot trigger runs or sync.'
permissions:
- admin.employees.view
- admin.payroll.download-payslips
- admin.payroll.view
- admin.reports.view
category: null
highlights: []
risk_level: null
-
key: compliance-agent
label: 'Compliance Agent'
description: 'Monitor AZG/ARG warnings and review documents. Cannot verify/reject organisations.'
permissions:
- admin.audit.view
- admin.compliance.minimum-wage-warnings
- admin.compliance.view
- admin.compliance.working-time-warnings
- admin.employees.review-documents
- admin.employees.view
- admin.organizations.view
category: null
highlights: []
risk_level: null
-
key: support-supervisor
label: 'Support Supervisor'
description: 'Full support-ticket control including assignment and escalation.'
permissions:
- admin.employees.view
- admin.organizations.view
- admin.reports.view
- admin.support.assign-tickets
- admin.support.escalate-tickets
- admin.support.resolve-tickets
- admin.support.update
- admin.support.view
- admin.support.view-tickets
- admin.users.view
category: null
highlights: []
risk_level: null
-
key: ops-agent
label: 'Operations Agent'
description: 'Review employee/company applications and monitor jobs. Cannot approve or reject.'
permissions:
- admin.assignments.view
- admin.employees.review-documents
- admin.employees.view
- admin.jobs.view
- admin.organizations.review-documents
- admin.organizations.view
category: null
highlights: []
risk_level: null
-
key: finance-agent
label: 'Finance Agent'
description: 'View invoices and payments. Cannot finalize invoices or manage dunning.'
permissions:
- admin.billing.view
- admin.finance.view-invoices
- admin.finance.view-payments
- admin.reports.view
category: null
highlights: []
risk_level: null
-
key: support-agent
label: 'Support Agent'
description: 'Handle support tickets, view user and organization information for context.'
permissions:
- admin.employees.view
- admin.organizations.view
- admin.support.resolve-tickets
- admin.support.update
- admin.support.view
- admin.support.view-tickets
- admin.users.view
category: null
highlights: []
risk_level: null
-
key: admin
label: Admin
description: 'Standard admin: org/user management, audit log, settings. Use SRS roles instead.'
permissions:
- admin.admins.view
- admin.app-settings.update
- admin.app-settings.view
- admin.audit.view
- admin.employees.approve
- admin.employees.flag-high-risk
- admin.employees.reactivate
- admin.employees.reject
- admin.employees.request-correction
- admin.employees.review-documents
- admin.employees.suspend
- admin.employees.validate-svs
- admin.employees.view
- admin.organizations.reactivate
- admin.organizations.reject
- admin.organizations.reset-password
- admin.organizations.review-documents
- admin.organizations.suspend
- admin.organizations.update
- admin.organizations.verify
- admin.organizations.view
- admin.reports.view
- admin.users.change-status
- admin.users.reset-password
- admin.users.update
- admin.users.update-by-admin
- admin.users.view
category: platform_admin
highlights:
- presets.admin.highlights.review_orgs
- presets.admin.highlights.moderate_campaigns
- presets.admin.highlights.approve_payouts
- presets.admin.highlights.no_admin_management
risk_level: high
-
key: moderator
label: Moderator
description: 'Read-only: view organisations, users, audit log. Use "support-agent" instead.'
permissions:
- admin.audit.view
- admin.employees.view
- admin.organizations.view
- admin.users.view
category: content
highlights:
- presets.moderator.highlights.view_organizations
- presets.moderator.highlights.view_users
- presets.moderator.highlights.no_money_actions
risk_level: medium
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 2762271f-0d07-4368-802a-e50e0d9f8403
timestamp:
type: string
examples:
- '2026-08-05T16:18:43.032923Z'
examples:
-
status: SUCCESS
message: Success
data:
-
key: super-admin
label: 'Super Admin'
description: 'Unrestricted admin access including GDPR operations, app secrets, and admin account management.'
permissions:
- admin.admins.create
- admin.admins.deactivate
- admin.admins.reactivate
- admin.admins.reset-2fa
- admin.admins.update
- admin.admins.update-presets
- admin.admins.update-role
- admin.admins.view
- admin.app-settings.reveal-secret
- admin.app-settings.update
- admin.app-settings.view
- admin.assignments.manage
- admin.assignments.view
- admin.audit.view
- admin.billing.update
- admin.billing.view
- admin.compliance.aueg-monitor
- admin.compliance.minimum-wage-warnings
- admin.compliance.view
- admin.compliance.working-time-warnings
- admin.contracts.manage
- admin.contracts.view
- admin.employees.approve
- admin.employees.flag-high-risk
- admin.employees.reactivate
- admin.employees.reject
- admin.employees.request-correction
- admin.employees.review-documents
- admin.employees.suspend
- admin.employees.validate-svs
- admin.employees.view
- admin.finance.manage-dunning
- admin.finance.manage-invoices
- admin.finance.view-invoices
- admin.finance.view-payments
- admin.gdpr.anonymize
- admin.gdpr.export
- admin.gdpr.restrict
- admin.jobs.approve
- admin.jobs.emergency-close
- admin.jobs.emergency-reassign
- admin.jobs.manage-categories
- admin.jobs.manage-document-types
- admin.jobs.reject
- admin.jobs.view
- admin.legal.manage
- admin.legal.view
- admin.organizations.reactivate
- admin.organizations.reject
- admin.organizations.reset-password
- admin.organizations.review-documents
- admin.organizations.suspend
- admin.organizations.update
- admin.organizations.verify
- admin.organizations.view
- admin.payroll.download-payslips
- admin.payroll.sync
- admin.payroll.trigger
- admin.payroll.view
- admin.ratings.moderate
- admin.ratings.view
- admin.reports.export
- admin.reports.view
- admin.security.detect-duplicates
- admin.security.manual-review
- admin.support.assign-tickets
- admin.support.escalate-tickets
- admin.support.resolve-tickets
- admin.support.update
- admin.support.view
- admin.support.view-tickets
- admin.system.view-health
- admin.system.view-metrics
- admin.users.change-status
- admin.users.reset-password
- admin.users.update
- admin.users.update-by-admin
- admin.users.view
category: platform_admin
highlights:
- presets.super-admin.highlights.full_access
- presets.super-admin.highlights.manage_admins
- presets.super-admin.highlights.platform_settings
risk_level: high
-
key: payroll-admin
label: 'Payroll Admin'
description: 'Manage payroll calculations, payslip generation, and ELDA submissions.'
permissions:
- admin.contracts.view
- admin.employees.view
- admin.payroll.download-payslips
- admin.payroll.sync
- admin.payroll.trigger
- admin.payroll.view
- admin.reports.view
category: null
highlights: []
risk_level: null
-
key: compliance-officer
label: 'Compliance Officer'
description: 'Employee/company document review, compliance monitoring (AÜG/AZG/ARG), audit log access.'
permissions:
- admin.audit.view
- admin.compliance.aueg-monitor
- admin.compliance.minimum-wage-warnings
- admin.compliance.view
- admin.compliance.working-time-warnings
- admin.employees.approve
- admin.employees.flag-high-risk
- admin.employees.reactivate
- admin.employees.reject
- admin.employees.request-correction
- admin.employees.review-documents
- admin.employees.suspend
- admin.employees.validate-svs
- admin.employees.view
- admin.legal.manage
- admin.legal.view
- admin.organizations.reject
- admin.organizations.review-documents
- admin.organizations.verify
- admin.organizations.view
- admin.reports.view
- admin.security.detect-duplicates
- admin.security.manual-review
category: null
highlights: []
risk_level: null
-
key: operations-manager
label: 'Operations Manager'
description: 'Platform operations: employee/company review, support tickets, system health monitoring.'
permissions:
- admin.assignments.manage
- admin.assignments.view
- admin.employees.approve
- admin.employees.reject
- admin.employees.request-correction
- admin.employees.review-documents
- admin.employees.view
- admin.jobs.approve
- admin.jobs.emergency-close
- admin.jobs.emergency-reassign
- admin.jobs.manage-categories
- admin.jobs.manage-document-types
- admin.jobs.reject
- admin.jobs.view
- admin.organizations.reject
- admin.organizations.review-documents
- admin.organizations.verify
- admin.organizations.view
- admin.reports.view
- admin.support.assign-tickets
- admin.support.escalate-tickets
- admin.support.resolve-tickets
- admin.support.update
- admin.support.view
- admin.support.view-tickets
- admin.system.view-health
- admin.system.view-metrics
category: null
highlights: []
risk_level: null
-
key: finance-admin
label: 'Finance Admin'
description: 'Manage invoices, payments, and dunning processes.'
permissions:
- admin.billing.update
- admin.billing.view
- admin.finance.manage-dunning
- admin.finance.manage-invoices
- admin.finance.view-invoices
- admin.finance.view-payments
- admin.reports.export
- admin.reports.view
category: null
highlights: []
risk_level: null
-
key: payroll-agent
label: 'Payroll Agent'
description: 'View payroll status and download payslips. Cannot trigger runs or sync.'
permissions:
- admin.employees.view
- admin.payroll.download-payslips
- admin.payroll.view
- admin.reports.view
category: null
highlights: []
risk_level: null
-
key: compliance-agent
label: 'Compliance Agent'
description: 'Monitor AZG/ARG warnings and review documents. Cannot verify/reject organisations.'
permissions:
- admin.audit.view
- admin.compliance.minimum-wage-warnings
- admin.compliance.view
- admin.compliance.working-time-warnings
- admin.employees.review-documents
- admin.employees.view
- admin.organizations.view
category: null
highlights: []
risk_level: null
-
key: support-supervisor
label: 'Support Supervisor'
description: 'Full support-ticket control including assignment and escalation.'
permissions:
- admin.employees.view
- admin.organizations.view
- admin.reports.view
- admin.support.assign-tickets
- admin.support.escalate-tickets
- admin.support.resolve-tickets
- admin.support.update
- admin.support.view
- admin.support.view-tickets
- admin.users.view
category: null
highlights: []
risk_level: null
-
key: ops-agent
label: 'Operations Agent'
description: 'Review employee/company applications and monitor jobs. Cannot approve or reject.'
permissions:
- admin.assignments.view
- admin.employees.review-documents
- admin.employees.view
- admin.jobs.view
- admin.organizations.review-documents
- admin.organizations.view
category: null
highlights: []
risk_level: null
-
key: finance-agent
label: 'Finance Agent'
description: 'View invoices and payments. Cannot finalize invoices or manage dunning.'
permissions:
- admin.billing.view
- admin.finance.view-invoices
- admin.finance.view-payments
- admin.reports.view
category: null
highlights: []
risk_level: null
-
key: support-agent
label: 'Support Agent'
description: 'Handle support tickets, view user and organization information for context.'
permissions:
- admin.employees.view
- admin.organizations.view
- admin.support.resolve-tickets
- admin.support.update
- admin.support.view
- admin.support.view-tickets
- admin.users.view
category: null
highlights: []
risk_level: null
-
key: admin
label: Admin
description: 'Standard admin: org/user management, audit log, settings. Use SRS roles instead.'
permissions:
- admin.admins.view
- admin.app-settings.update
- admin.app-settings.view
- admin.audit.view
- admin.employees.approve
- admin.employees.flag-high-risk
- admin.employees.reactivate
- admin.employees.reject
- admin.employees.request-correction
- admin.employees.review-documents
- admin.employees.suspend
- admin.employees.validate-svs
- admin.employees.view
- admin.organizations.reactivate
- admin.organizations.reject
- admin.organizations.reset-password
- admin.organizations.review-documents
- admin.organizations.suspend
- admin.organizations.update
- admin.organizations.verify
- admin.organizations.view
- admin.reports.view
- admin.users.change-status
- admin.users.reset-password
- admin.users.update
- admin.users.update-by-admin
- admin.users.view
category: platform_admin
highlights:
- presets.admin.highlights.review_orgs
- presets.admin.highlights.moderate_campaigns
- presets.admin.highlights.approve_payouts
- presets.admin.highlights.no_admin_management
risk_level: high
-
key: moderator
label: Moderator
description: 'Read-only: view organisations, users, audit log. Use "support-agent" instead.'
permissions:
- admin.audit.view
- admin.employees.view
- admin.organizations.view
- admin.users.view
category: content
highlights:
- presets.moderator.highlights.view_organizations
- presets.moderator.highlights.view_users
- presets.moderator.highlights.no_money_actions
risk_level: medium
errors: null
meta:
request_id: 2762271f-0d07-4368-802a-e50e0d9f8403
timestamp: '2026-08-05T16:18:43.032923Z'
tags:
- 'Admin API'
/api/v1/admin/organizations:
get:
summary: 'List Organizations'
operationId: listOrganizations
description: 'Returns a paginated list of all organisations, optionally filtered by a search term (matched against name and email) and/or a status value.'
parameters:
-
in: query
name: search
description: 'Search keyword.'
required: false
schema:
type: string
description: 'Search keyword.'
examples:
- test
-
in: query
name: status
description: 'Filter by status.'
required: false
schema:
type: string
description: 'Filter by status.'
examples:
- active
-
in: query
name: per_page
description: 'Number of items per page.'
required: false
schema:
type: integer
description: 'Number of items per page.'
examples:
- 15
-
in: query
name: sort
description: 'Column to sort by.'
required: false
schema:
type: string
description: 'Column to sort by.'
examples:
- name
-
in: query
name: order
description: '"asc" or "desc".'
required: false
schema:
type: string
description: '"asc" or "desc".'
examples:
- asc
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- Success
data:
type: array
examples:
- []
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- fe7a27ad-e2c9-4825-af4a-7df8fb6beaaf
timestamp:
type: string
examples:
- '2026-08-05T16:18:42.087462Z'
current_page:
type: integer
examples:
- 1
last_page:
type: integer
examples:
- 1
per_page:
type: integer
examples:
- 15
total:
type: integer
examples:
- 0
examples:
-
status: SUCCESS
message: Success
data: []
errors: null
meta:
request_id: fe7a27ad-e2c9-4825-af4a-7df8fb6beaaf
timestamp: '2026-08-05T16:18:42.087462Z'
current_page: 1
last_page: 1
per_page: 15
total: 0
tags:
- 'Admin API'
/api/v1/admin/organizations/export:
get:
summary: 'Export Organizations'
operationId: exportOrganizations
description: 'Streams the full organisation list as a CSV file.'
parameters: []
responses:
503:
description: ''
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- ERROR
message:
type: string
examples:
- 'Service Unavailable'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type:
- string
- 'null'
examples:
- null
message:
type: string
examples:
- 'Service Unavailable'
examples:
-
-
field: null
message: 'Service Unavailable'
meta:
type: object
properties:
request_id:
type: string
examples:
- 09d5c681-e3a5-46ed-9a4d-9a3c9dbabc73
timestamp:
type: string
examples:
- '2026-08-21T05:14:35.938874Z'
examples:
-
status: ERROR
message: 'Service Unavailable'
data: null
errors:
-
field: null
message: 'Service Unavailable'
meta:
request_id: 09d5c681-e3a5-46ed-9a4d-9a3c9dbabc73
timestamp: '2026-08-21T05:14:35.938874Z'
tags:
- 'Admin API'
'/api/v1/admin/organizations/{organization_id}':
get:
summary: 'Returns the full profile of a single organisation, identified by'
operationId: returnsTheFullProfileOfASingleOrganisationIdentifiedBy
description: 'route-model binding. * @group Admin API'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Organisation retrieved successfully.'
data:
type: object
properties:
id:
type: string
examples:
- 019fd2b7-f072-7154-8961-5b324cc6c46c
name:
type: string
examples:
- Caritas
slug:
type: string
examples:
- caritas-4v1ues
email:
type: string
examples:
- caritas-portal@flexxr.eu.cc
country_code:
type: string
examples:
- '+43'
phone_number:
type: string
examples:
- '6641234567'
contact_person_name:
type:
- string
- 'null'
examples:
- null
contact_person_phone:
type:
- string
- 'null'
examples:
- null
iso_country_code:
type: string
examples:
- AT
phone_e164:
type: string
examples:
- '+436641234567'
description:
type: string
examples:
- 'Caritas test organisation used for end-to-end portal QA. Safe to delete.'
logo_url:
type:
- string
- 'null'
examples:
- null
website:
type: string
examples:
- 'https://www.caritas.at'
address:
type: string
examples:
- 'Albrechtskreithgasse 19-21'
address_line2:
type:
- string
- 'null'
examples:
- null
postal_code:
type:
- string
- 'null'
examples:
- null
city:
type: string
examples:
- Vienna
country:
type: string
examples:
- Austria
status:
type: string
examples:
- active
verified_at:
type: string
examples:
- '2026-08-05T16:18:17.000000Z'
is_verified:
type: boolean
examples:
- true
total_raised:
type:
- string
- 'null'
examples:
- null
created_at:
type: string
examples:
- '2026-08-05T16:18:17.000000Z'
platform_fee_flat_cents:
type:
- string
- 'null'
examples:
- null
firmenbuchnummer:
type:
- string
- 'null'
examples:
- null
uid_number:
type:
- string
- 'null'
examples:
- null
uid_validation_status:
type:
- string
- 'null'
examples:
- null
gisa_status:
type: string
examples:
- pending
payout_method:
type:
- string
- 'null'
examples:
- null
stripe_connect_account_id:
type:
- string
- 'null'
examples:
- null
connect_charges_enabled:
type:
- string
- 'null'
examples:
- null
connect_payouts_enabled:
type:
- string
- 'null'
examples:
- null
connect_details_submitted:
type:
- string
- 'null'
examples:
- null
connect_requirements_due:
type:
- string
- 'null'
examples:
- null
connect_country_code:
type:
- string
- 'null'
examples:
- null
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 5f3a0146-cc1c-4a3d-832d-77df0c4cec1f
timestamp:
type: string
examples:
- '2026-08-05T16:18:42.101496Z'
examples:
-
status: SUCCESS
message: 'Organisation retrieved successfully.'
data:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
slug: caritas-4v1ues
email: caritas-portal@flexxr.eu.cc
country_code: '+43'
phone_number: '6641234567'
contact_person_name: null
contact_person_phone: null
iso_country_code: AT
phone_e164: '+436641234567'
description: 'Caritas test organisation used for end-to-end portal QA. Safe to delete.'
logo_url: null
website: 'https://www.caritas.at'
address: 'Albrechtskreithgasse 19-21'
address_line2: null
postal_code: null
city: Vienna
country: Austria
status: active
verified_at: '2026-08-05T16:18:17.000000Z'
is_verified: true
total_raised: null
created_at: '2026-08-05T16:18:17.000000Z'
platform_fee_flat_cents: null
firmenbuchnummer: null
uid_number: null
uid_validation_status: null
gisa_status: pending
payout_method: null
stripe_connect_account_id: null
connect_charges_enabled: null
connect_payouts_enabled: null
connect_details_submitted: null
connect_requirements_due: null
connect_country_code: null
errors: null
meta:
request_id: 5f3a0146-cc1c-4a3d-832d-77df0c4cec1f
timestamp: '2026-08-05T16:18:42.101496Z'
tags:
- 'Admin API'
patch:
summary: 'Updates mutable profile fields on an organisation as an admin.'
operationId: updatesMutableProfileFieldsOnAnOrganisationAsAnAdmin
description: "Only the fields present in the request are applied; absent keys leave\nexisting values untouched (PATCH semantics). Status transitions, bank-detail\n\nchanges, and verification metadata are handled by dedicated endpoints. * @group Admin API"
parameters: []
responses: { }
tags:
- 'Admin API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: ''
examples:
- Beispieltext
description:
type:
- string
- 'null'
description: ''
examples:
- Beispieltext
logo_url:
type:
- string
- 'null'
description: ''
examples:
- Beispieltext
website:
type:
- string
- 'null'
description: ''
examples:
- Beispieltext
address:
type:
- string
- 'null'
description: ''
examples:
- Beispieltext
address_line2:
type:
- string
- 'null'
description: ''
examples:
- Beispieltext
postal_code:
type:
- string
- 'null'
description: ''
examples:
- AT
city:
type:
- string
- 'null'
description: ''
examples:
- Beispieltext
country:
type:
- string
- 'null'
description: ''
examples:
- Beispieltext
iso_country_code:
type:
- string
- 'null'
description: ''
examples:
- AT
platform_fee_flat_cents:
type:
- integer
- 'null'
description: ''
examples:
- 1
country_code:
type:
- string
- 'null'
description: ''
examples:
- AT
phone_number:
type:
- string
- 'null'
description: ''
examples:
- '6641234567'
required:
- country_code
- phone_number
parameters:
-
in: path
name: organization_id
description: 'The ID of the organization.'
required: true
schema:
type: string
examples:
- 019f0593-c95d-73f3-aced-b962c9664f8d
'/api/v1/admin/organizations/{organization_id}/verify':
put:
summary: 'Verify Organization'
operationId: verifyOrganization
description: 'Verifies a pending organisation, transitioning it to Active status.'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Organisation verified successfully.'
data:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-2abb-7347-a732-5c2c2ee4f03c
name:
type: string
examples:
- 'Feeney, Howell and Stehr'
slug:
type: string
examples:
- feeney-howell-and-stehr-bfcdiz
email:
type: string
examples:
- gunnar90@hahn.com
country_code:
type: string
examples:
- '+1'
phone_number:
type: string
examples:
- '2025550275'
contact_person_name:
type:
- string
- 'null'
examples:
- null
contact_person_phone:
type:
- string
- 'null'
examples:
- null
iso_country_code:
type:
- string
- 'null'
examples:
- null
phone_e164:
type: string
examples:
- '+12025550275'
description:
type: string
examples:
- 'Dolor aspernatur eligendi nam enim tempore. Possimus est unde quia dignissimos dolore unde eos. Est quos quam enim voluptatem ut molestiae.'
logo_url:
type:
- string
- 'null'
examples:
- null
website:
type:
- string
- 'null'
examples:
- null
address:
type:
- string
- 'null'
examples:
- null
address_line2:
type:
- string
- 'null'
examples:
- null
postal_code:
type:
- string
- 'null'
examples:
- null
city:
type:
- string
- 'null'
examples:
- null
country:
type:
- string
- 'null'
examples:
- null
status:
type: string
examples:
- active
verified_at:
type: string
examples:
- '2026-08-05T16:18:42.000000Z'
is_verified:
type: boolean
examples:
- true
total_raised:
type:
- string
- 'null'
examples:
- null
created_at:
type: string
examples:
- '2026-08-05T16:18:32.000000Z'
platform_fee_flat_cents:
type:
- string
- 'null'
examples:
- null
firmenbuchnummer:
type:
- string
- 'null'
examples:
- null
uid_number:
type:
- string
- 'null'
examples:
- null
uid_validation_status:
type:
- string
- 'null'
examples:
- null
payout_method:
type:
- string
- 'null'
examples:
- null
stripe_connect_account_id:
type:
- string
- 'null'
examples:
- null
connect_charges_enabled:
type:
- string
- 'null'
examples:
- null
connect_payouts_enabled:
type:
- string
- 'null'
examples:
- null
connect_details_submitted:
type:
- string
- 'null'
examples:
- null
connect_requirements_due:
type:
- string
- 'null'
examples:
- null
connect_country_code:
type:
- string
- 'null'
examples:
- null
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 1e3ae433-1435-4a4b-8cd3-6c871aa8c9ea
timestamp:
type: string
examples:
- '2026-08-05T16:18:42.117609Z'
examples:
-
status: SUCCESS
message: 'Organisation verified successfully.'
data:
id: 019fd2b8-2abb-7347-a732-5c2c2ee4f03c
name: 'Feeney, Howell and Stehr'
slug: feeney-howell-and-stehr-bfcdiz
email: gunnar90@hahn.com
country_code: '+1'
phone_number: '2025550275'
contact_person_name: null
contact_person_phone: null
iso_country_code: null
phone_e164: '+12025550275'
description: 'Dolor aspernatur eligendi nam enim tempore. Possimus est unde quia dignissimos dolore unde eos. Est quos quam enim voluptatem ut molestiae.'
logo_url: null
website: null
address: null
address_line2: null
postal_code: null
city: null
country: null
status: active
verified_at: '2026-08-05T16:18:42.000000Z'
is_verified: true
total_raised: null
created_at: '2026-08-05T16:18:32.000000Z'
platform_fee_flat_cents: null
firmenbuchnummer: null
uid_number: null
uid_validation_status: null
payout_method: null
stripe_connect_account_id: null
connect_charges_enabled: null
connect_payouts_enabled: null
connect_details_submitted: null
connect_requirements_due: null
connect_country_code: null
errors: null
meta:
request_id: 1e3ae433-1435-4a4b-8cd3-6c871aa8c9ea
timestamp: '2026-08-05T16:18:42.117609Z'
tags:
- 'Admin API'
parameters:
-
in: path
name: organization_id
description: 'The ID of the organization.'
required: true
schema:
type: string
examples:
- 019f0593-c95d-73f3-aced-b962c9664f8d
-
in: path
name: organization
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
'/api/v1/admin/organizations/{organization_id}/reject':
put:
summary: 'Reject Organization'
operationId: rejectOrganization
description: 'Rejects a pending organisation application.'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Organisation rejected.'
data:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-2abb-7347-a732-5c2c2ee4f03c
name:
type: string
examples:
- 'Feeney, Howell and Stehr'
slug:
type: string
examples:
- feeney-howell-and-stehr-bfcdiz
email:
type: string
examples:
- gunnar90@hahn.com
country_code:
type: string
examples:
- '+1'
phone_number:
type: string
examples:
- '2025550275'
contact_person_name:
type:
- string
- 'null'
examples:
- null
contact_person_phone:
type:
- string
- 'null'
examples:
- null
iso_country_code:
type:
- string
- 'null'
examples:
- null
phone_e164:
type: string
examples:
- '+12025550275'
description:
type: string
examples:
- 'Dolor aspernatur eligendi nam enim tempore. Possimus est unde quia dignissimos dolore unde eos. Est quos quam enim voluptatem ut molestiae.'
logo_url:
type:
- string
- 'null'
examples:
- null
website:
type:
- string
- 'null'
examples:
- null
address:
type:
- string
- 'null'
examples:
- null
address_line2:
type:
- string
- 'null'
examples:
- null
postal_code:
type:
- string
- 'null'
examples:
- null
city:
type:
- string
- 'null'
examples:
- null
country:
type:
- string
- 'null'
examples:
- null
status:
type: string
examples:
- rejected
verified_at:
type:
- string
- 'null'
examples:
- null
is_verified:
type: boolean
examples:
- false
total_raised:
type:
- string
- 'null'
examples:
- null
created_at:
type: string
examples:
- '2026-08-05T16:18:32.000000Z'
platform_fee_flat_cents:
type:
- string
- 'null'
examples:
- null
firmenbuchnummer:
type:
- string
- 'null'
examples:
- null
uid_number:
type:
- string
- 'null'
examples:
- null
uid_validation_status:
type:
- string
- 'null'
examples:
- null
payout_method:
type:
- string
- 'null'
examples:
- null
stripe_connect_account_id:
type:
- string
- 'null'
examples:
- null
connect_charges_enabled:
type:
- string
- 'null'
examples:
- null
connect_payouts_enabled:
type:
- string
- 'null'
examples:
- null
connect_details_submitted:
type:
- string
- 'null'
examples:
- null
connect_requirements_due:
type:
- string
- 'null'
examples:
- null
connect_country_code:
type:
- string
- 'null'
examples:
- null
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 628391df-a753-4ffc-b5aa-8eb743ba49ba
timestamp:
type: string
examples:
- '2026-08-05T16:18:42.132018Z'
examples:
-
status: SUCCESS
message: 'Organisation rejected.'
data:
id: 019fd2b8-2abb-7347-a732-5c2c2ee4f03c
name: 'Feeney, Howell and Stehr'
slug: feeney-howell-and-stehr-bfcdiz
email: gunnar90@hahn.com
country_code: '+1'
phone_number: '2025550275'
contact_person_name: null
contact_person_phone: null
iso_country_code: null
phone_e164: '+12025550275'
description: 'Dolor aspernatur eligendi nam enim tempore. Possimus est unde quia dignissimos dolore unde eos. Est quos quam enim voluptatem ut molestiae.'
logo_url: null
website: null
address: null
address_line2: null
postal_code: null
city: null
country: null
status: rejected
verified_at: null
is_verified: false
total_raised: null
created_at: '2026-08-05T16:18:32.000000Z'
platform_fee_flat_cents: null
firmenbuchnummer: null
uid_number: null
uid_validation_status: null
payout_method: null
stripe_connect_account_id: null
connect_charges_enabled: null
connect_payouts_enabled: null
connect_details_submitted: null
connect_requirements_due: null
connect_country_code: null
errors: null
meta:
request_id: 628391df-a753-4ffc-b5aa-8eb743ba49ba
timestamp: '2026-08-05T16:18:42.132018Z'
tags:
- 'Admin API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
reason:
type: string
description: ''
examples:
- 'Krankheitsbedingt kurzfristig abgesagt.'
required:
- reason
parameters:
-
in: path
name: organization_id
description: 'The ID of the organization.'
required: true
schema:
type: string
examples:
- 019f0593-c95d-73f3-aced-b962c9664f8d
-
in: path
name: organization
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
'/api/v1/admin/organizations/{organization_id}/suspend':
put:
summary: 'Suspends an active organisation and immediately revokes all active tokens.'
operationId: suspendsAnActiveOrganisationAndImmediatelyRevokesAllActiveTokens
description: "Business-rule enforcement (active-only guard) is handled inside\n\nOrganizationService::suspend(). * @group Admin API"
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Organisation suspended successfully.'
data:
type: object
properties:
id:
type: string
examples:
- 019fd2b7-f072-7154-8961-5b324cc6c46c
name:
type: string
examples:
- Caritas
slug:
type: string
examples:
- caritas-4v1ues
email:
type: string
examples:
- caritas-portal@flexxr.eu.cc
country_code:
type: string
examples:
- '+43'
phone_number:
type: string
examples:
- '6641234567'
contact_person_name:
type:
- string
- 'null'
examples:
- null
contact_person_phone:
type:
- string
- 'null'
examples:
- null
iso_country_code:
type: string
examples:
- AT
phone_e164:
type: string
examples:
- '+436641234567'
description:
type: string
examples:
- 'Caritas test organisation used for end-to-end portal QA. Safe to delete.'
logo_url:
type:
- string
- 'null'
examples:
- null
website:
type: string
examples:
- 'https://www.caritas.at'
address:
type: string
examples:
- 'Albrechtskreithgasse 19-21'
address_line2:
type:
- string
- 'null'
examples:
- null
postal_code:
type:
- string
- 'null'
examples:
- null
city:
type: string
examples:
- Vienna
country:
type: string
examples:
- Austria
status:
type: string
examples:
- suspended
verified_at:
type: string
examples:
- '2026-08-05T16:18:17.000000Z'
is_verified:
type: boolean
examples:
- true
total_raised:
type:
- string
- 'null'
examples:
- null
created_at:
type: string
examples:
- '2026-08-05T16:18:17.000000Z'
platform_fee_flat_cents:
type:
- string
- 'null'
examples:
- null
firmenbuchnummer:
type:
- string
- 'null'
examples:
- null
uid_number:
type:
- string
- 'null'
examples:
- null
uid_validation_status:
type:
- string
- 'null'
examples:
- null
payout_method:
type:
- string
- 'null'
examples:
- null
stripe_connect_account_id:
type:
- string
- 'null'
examples:
- null
connect_charges_enabled:
type:
- string
- 'null'
examples:
- null
connect_payouts_enabled:
type:
- string
- 'null'
examples:
- null
connect_details_submitted:
type:
- string
- 'null'
examples:
- null
connect_requirements_due:
type:
- string
- 'null'
examples:
- null
connect_country_code:
type:
- string
- 'null'
examples:
- null
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 55ed4c84-a8de-451b-a958-d4747f155cd0
timestamp:
type: string
examples:
- '2026-08-05T16:18:42.146772Z'
examples:
-
status: SUCCESS
message: 'Organisation suspended successfully.'
data:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
slug: caritas-4v1ues
email: caritas-portal@flexxr.eu.cc
country_code: '+43'
phone_number: '6641234567'
contact_person_name: null
contact_person_phone: null
iso_country_code: AT
phone_e164: '+436641234567'
description: 'Caritas test organisation used for end-to-end portal QA. Safe to delete.'
logo_url: null
website: 'https://www.caritas.at'
address: 'Albrechtskreithgasse 19-21'
address_line2: null
postal_code: null
city: Vienna
country: Austria
status: suspended
verified_at: '2026-08-05T16:18:17.000000Z'
is_verified: true
total_raised: null
created_at: '2026-08-05T16:18:17.000000Z'
platform_fee_flat_cents: null
firmenbuchnummer: null
uid_number: null
uid_validation_status: null
payout_method: null
stripe_connect_account_id: null
connect_charges_enabled: null
connect_payouts_enabled: null
connect_details_submitted: null
connect_requirements_due: null
connect_country_code: null
errors: null
meta:
request_id: 55ed4c84-a8de-451b-a958-d4747f155cd0
timestamp: '2026-08-05T16:18:42.146772Z'
tags:
- 'Admin API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
reason:
type: string
description: ''
examples:
- 'Krankheitsbedingt kurzfristig abgesagt.'
required:
- reason
parameters:
-
in: path
name: organization_id
description: 'The ID of the organization.'
required: true
schema:
type: string
examples:
- 019f0593-c95d-73f3-aced-b962c9664f8d
'/api/v1/admin/organizations/{organization_id}/reactivate':
put:
summary: 'Reactivates a suspended organisation, restoring its ability to operate.'
operationId: reactivatesASuspendedOrganisationRestoringItsAbilityToOperate
description: "The original verification metadata (verified_at, verified_by) is preserved\nunchanged. Business-rule enforcement (suspended-only guard) is handled inside\n\nOrganizationService::reactivate(). * @group Admin API"
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Organisation reactivated successfully.'
data:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-2b93-70ff-9a0a-ef0bb511b558
name:
type: string
examples:
- 'Cormier and Sons'
slug:
type: string
examples:
- cormier-and-sons-vnw4vm
email:
type: string
examples:
- wisozk.agustin@pacocha.org
country_code:
type: string
examples:
- '+1'
phone_number:
type: string
examples:
- '2025550634'
contact_person_name:
type:
- string
- 'null'
examples:
- null
contact_person_phone:
type:
- string
- 'null'
examples:
- null
iso_country_code:
type:
- string
- 'null'
examples:
- null
phone_e164:
type: string
examples:
- '+12025550634'
description:
type: string
examples:
- 'Maxime omnis maxime autem aliquid voluptas magni consequatur nesciunt. Sapiente quam quae laudantium culpa reiciendis repellat dolores. Exercitationem expedita et eum modi.'
logo_url:
type:
- string
- 'null'
examples:
- null
website:
type:
- string
- 'null'
examples:
- null
address:
type:
- string
- 'null'
examples:
- null
address_line2:
type:
- string
- 'null'
examples:
- null
postal_code:
type:
- string
- 'null'
examples:
- null
city:
type:
- string
- 'null'
examples:
- null
country:
type:
- string
- 'null'
examples:
- null
status:
type: string
examples:
- active
verified_at:
type:
- string
- 'null'
examples:
- null
is_verified:
type: boolean
examples:
- false
total_raised:
type:
- string
- 'null'
examples:
- null
created_at:
type: string
examples:
- '2026-08-05T16:18:32.000000Z'
platform_fee_flat_cents:
type:
- string
- 'null'
examples:
- null
firmenbuchnummer:
type:
- string
- 'null'
examples:
- null
uid_number:
type:
- string
- 'null'
examples:
- null
uid_validation_status:
type:
- string
- 'null'
examples:
- null
payout_method:
type:
- string
- 'null'
examples:
- null
stripe_connect_account_id:
type:
- string
- 'null'
examples:
- null
connect_charges_enabled:
type:
- string
- 'null'
examples:
- null
connect_payouts_enabled:
type:
- string
- 'null'
examples:
- null
connect_details_submitted:
type:
- string
- 'null'
examples:
- null
connect_requirements_due:
type:
- string
- 'null'
examples:
- null
connect_country_code:
type:
- string
- 'null'
examples:
- null
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- c586e4b9-d8d2-4f0f-b3a1-d4339de77df8
timestamp:
type: string
examples:
- '2026-08-05T16:18:42.159248Z'
examples:
-
status: SUCCESS
message: 'Organisation reactivated successfully.'
data:
id: 019fd2b8-2b93-70ff-9a0a-ef0bb511b558
name: 'Cormier and Sons'
slug: cormier-and-sons-vnw4vm
email: wisozk.agustin@pacocha.org
country_code: '+1'
phone_number: '2025550634'
contact_person_name: null
contact_person_phone: null
iso_country_code: null
phone_e164: '+12025550634'
description: 'Maxime omnis maxime autem aliquid voluptas magni consequatur nesciunt. Sapiente quam quae laudantium culpa reiciendis repellat dolores. Exercitationem expedita et eum modi.'
logo_url: null
website: null
address: null
address_line2: null
postal_code: null
city: null
country: null
status: active
verified_at: null
is_verified: false
total_raised: null
created_at: '2026-08-05T16:18:32.000000Z'
platform_fee_flat_cents: null
firmenbuchnummer: null
uid_number: null
uid_validation_status: null
payout_method: null
stripe_connect_account_id: null
connect_charges_enabled: null
connect_payouts_enabled: null
connect_details_submitted: null
connect_requirements_due: null
connect_country_code: null
errors: null
meta:
request_id: c586e4b9-d8d2-4f0f-b3a1-d4339de77df8
timestamp: '2026-08-05T16:18:42.159248Z'
tags:
- 'Admin API'
parameters:
-
in: path
name: organization_id
description: 'The ID of the organization.'
required: true
schema:
type: string
examples:
- 019f0593-c95d-73f3-aced-b962c9664f8d
'/api/v1/admin/organizations/{organization_id}/send-reset':
post:
summary: 'Admin-triggered organisation password reset code.'
operationId: adminTriggeredOrganisationPasswordResetCode
description: "Dispatches the same 6-digit code the org would receive via the public\n`/api/v1/org/auth/forgot-password` endpoint — keeping the reset flow\nidentical regardless of who initiated it. The admin never sees the code\nitself; the org follows the standard `forgot-password → verify-code →\nreset-password` path on the company portal.\n\nUse case: an org owner who cannot log in (lost device, lost access to\ntheir inbox, etc.) phones Flexxr support, the operator confirms identity\nout-of-band, and then triggers this endpoint to push a fresh code to\nthe org's primary email — without exposing the code to the operator."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Password reset email sent.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 5fdc2a18-95f3-4f95-9f60-dd08aa90ef1a
timestamp:
type: string
examples:
- '2026-08-05T16:18:42.182780Z'
examples:
-
status: SUCCESS
message: 'Password reset email sent.'
data: null
errors: null
meta:
request_id: 5fdc2a18-95f3-4f95-9f60-dd08aa90ef1a
timestamp: '2026-08-05T16:18:42.182780Z'
tags:
- 'Admin API'
parameters:
-
in: path
name: organization_id
description: 'The ID of the organization.'
required: true
schema:
type: string
examples:
- 019f0593-c95d-73f3-aced-b962c9664f8d
'/api/v1/admin/organizations/{organization_id}/logo':
post:
summary: 'Upload Organisation Logo (Admin)'
operationId: uploadOrganisationLogoAdmin
description: 'Stores a new logo file for the given organisation and returns the updated profile.'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Logo uploaded successfully.'
data:
type: object
properties:
id:
type: string
examples:
- 019fd2b7-f072-7154-8961-5b324cc6c46c
name:
type: string
examples:
- Caritas
slug:
type: string
examples:
- caritas-4v1ues
email:
type: string
examples:
- caritas-portal@flexxr.eu.cc
country_code:
type: string
examples:
- '+43'
phone_number:
type: string
examples:
- '6641234567'
contact_person_name:
type:
- string
- 'null'
examples:
- null
contact_person_phone:
type:
- string
- 'null'
examples:
- null
iso_country_code:
type: string
examples:
- AT
phone_e164:
type: string
examples:
- '+436641234567'
description:
type: string
examples:
- 'Caritas test organisation used for end-to-end portal QA. Safe to delete.'
logo_url:
type: string
examples:
- /storage/logos/organizations/QWGcqEq0WGb4VTvFnrdZJoIvCxZThaklKavUGS4l.jpg
website:
type: string
examples:
- 'https://www.caritas.at'
address:
type: string
examples:
- 'Albrechtskreithgasse 19-21'
address_line2:
type:
- string
- 'null'
examples:
- null
postal_code:
type:
- string
- 'null'
examples:
- null
city:
type: string
examples:
- Vienna
country:
type: string
examples:
- Austria
status:
type: string
examples:
- active
verified_at:
type: string
examples:
- '2026-08-05T16:18:17.000000Z'
is_verified:
type: boolean
examples:
- true
total_raised:
type:
- string
- 'null'
examples:
- null
created_at:
type: string
examples:
- '2026-08-05T16:18:17.000000Z'
platform_fee_flat_cents:
type:
- string
- 'null'
examples:
- null
firmenbuchnummer:
type:
- string
- 'null'
examples:
- null
uid_number:
type:
- string
- 'null'
examples:
- null
uid_validation_status:
type:
- string
- 'null'
examples:
- null
payout_method:
type:
- string
- 'null'
examples:
- null
stripe_connect_account_id:
type:
- string
- 'null'
examples:
- null
connect_charges_enabled:
type:
- string
- 'null'
examples:
- null
connect_payouts_enabled:
type:
- string
- 'null'
examples:
- null
connect_details_submitted:
type:
- string
- 'null'
examples:
- null
connect_requirements_due:
type:
- string
- 'null'
examples:
- null
connect_country_code:
type:
- string
- 'null'
examples:
- null
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 57d1c22e-3512-4367-8950-b4df2bd39ae3
timestamp:
type: string
examples:
- '2026-08-05T16:18:42.194784Z'
examples:
-
status: SUCCESS
message: 'Logo uploaded successfully.'
data:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
slug: caritas-4v1ues
email: caritas-portal@flexxr.eu.cc
country_code: '+43'
phone_number: '6641234567'
contact_person_name: null
contact_person_phone: null
iso_country_code: AT
phone_e164: '+436641234567'
description: 'Caritas test organisation used for end-to-end portal QA. Safe to delete.'
logo_url: /storage/logos/organizations/QWGcqEq0WGb4VTvFnrdZJoIvCxZThaklKavUGS4l.jpg
website: 'https://www.caritas.at'
address: 'Albrechtskreithgasse 19-21'
address_line2: null
postal_code: null
city: Vienna
country: Austria
status: active
verified_at: '2026-08-05T16:18:17.000000Z'
is_verified: true
total_raised: null
created_at: '2026-08-05T16:18:17.000000Z'
platform_fee_flat_cents: null
firmenbuchnummer: null
uid_number: null
uid_validation_status: null
payout_method: null
stripe_connect_account_id: null
connect_charges_enabled: null
connect_payouts_enabled: null
connect_details_submitted: null
connect_requirements_due: null
connect_country_code: null
errors: null
meta:
request_id: 57d1c22e-3512-4367-8950-b4df2bd39ae3
timestamp: '2026-08-05T16:18:42.194784Z'
404:
description: 'Organisation Not Found'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- NOT_FOUND
message:
type: string
examples:
- 'No query results for model [Organization].'
data:
type:
- string
- 'null'
examples:
- null
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-05-01T10:00:00.000000Z'
examples:
-
status: NOT_FOUND
message: 'No query results for model [Organization].'
data: null
errors: null
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-05-01T10:00:00.000000Z'
422:
description: 'Validation Error'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- VALIDATION_ERROR
message:
type: string
examples:
- 'Validation failed.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type: string
examples:
- logo
message:
type: string
examples:
- 'The logo field is required.'
examples:
-
-
field: logo
message: 'The logo field is required.'
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-05-01T10:00:00.000000Z'
examples:
-
status: VALIDATION_ERROR
message: 'Validation failed.'
data: null
errors:
-
field: logo
message: 'The logo field is required.'
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-05-01T10:00:00.000000Z'
tags:
- 'Admin API'
requestBody:
required: true
content:
multipart/form-data:
schema:
type: object
properties:
logo:
type: string
format: binary
description: 'Organisation logo image file (max 2MB).'
required:
- logo
parameters:
-
in: path
name: organization_id
description: 'The ID of the organization.'
required: true
schema:
type: string
examples:
- 019f0593-c95d-73f3-aced-b962c9664f8d
'/api/v1/admin/organizations/{organization_id}/team':
get:
summary: "Lists the team members of a specific organisation for the admin\ndetail page."
operationId: listsTheTeamMembersOfASpecificOrganisationForTheAdminDetailPage
description: "Phase-1 mirrors {@see ListOrgTeamAction}:\nthe only seat is the organisation principal itself. The shape is\nfrozen so the admin UI renders today and switches to multi-user\nmode the day the `organization_members` pivot lands."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- Success
data:
type: array
items:
type: object
properties:
id:
type: string
examples:
- 019fd2b7-f072-7154-8961-5b324cc6c46c
organization_id:
type: string
examples:
- 019fd2b7-f072-7154-8961-5b324cc6c46c
name:
type: string
examples:
- Caritas
email:
type: string
examples:
- caritas-portal@flexxr.eu.cc
role:
type: string
examples:
- owner
status:
type: string
examples:
- active
avatar_url:
type:
- string
- 'null'
examples:
- null
is_principal:
type: boolean
examples:
- true
joined_at:
type: string
examples:
- '2026-08-05T16:18:17+00:00'
last_active_at:
type: string
examples:
- '2026-08-05T16:18:33+00:00'
examples:
-
-
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
organization_id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
email: caritas-portal@flexxr.eu.cc
role: owner
status: active
avatar_url: null
is_principal: true
joined_at: '2026-08-05T16:18:17+00:00'
last_active_at: '2026-08-05T16:18:33+00:00'
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 99d177f8-4686-4277-8f80-b2a436581fb7
timestamp:
type: string
examples:
- '2026-08-05T16:18:42.213358Z'
examples:
-
status: SUCCESS
message: Success
data:
-
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
organization_id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
email: caritas-portal@flexxr.eu.cc
role: owner
status: active
avatar_url: null
is_principal: true
joined_at: '2026-08-05T16:18:17+00:00'
last_active_at: '2026-08-05T16:18:33+00:00'
errors: null
meta:
request_id: 99d177f8-4686-4277-8f80-b2a436581fb7
timestamp: '2026-08-05T16:18:42.213358Z'
tags:
- 'Admin API'
parameters:
-
in: path
name: organization_id
description: 'The ID of the organization.'
required: true
schema:
type: string
examples:
- 019f0593-c95d-73f3-aced-b962c9664f8d
'/api/v1/admin/organizations/{organization_id}/invitations':
get:
summary: "Lists every team invitation (pending, accepted, revoked, expired) for\na specific organisation. Powers the admin organisation detail page so\nsupport can see the invitation funnel without logging in as the org."
operationId: listsEveryTeamInvitationpendingAcceptedRevokedExpiredForASpecificOrganisationPowersTheAdminOrganisationDetailPageSoSupportCanSeeTheInvitationFunnelWithoutLoggingInAsTheOrg
description: ''
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- Success
data:
type: array
examples:
- []
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 0c3a868f-3ae6-4436-836f-837c0d3bc51b
timestamp:
type: string
examples:
- '2026-08-05T16:18:42.226051Z'
examples:
-
status: SUCCESS
message: Success
data: []
errors: null
meta:
request_id: 0c3a868f-3ae6-4436-836f-837c0d3bc51b
timestamp: '2026-08-05T16:18:42.226051Z'
tags:
- 'Admin API'
parameters:
-
in: path
name: organization_id
description: 'The ID of the organization.'
required: true
schema:
type: string
examples:
- 019f0593-c95d-73f3-aced-b962c9664f8d
'/api/v1/admin/organizations/{organization_id}/documents':
get:
summary: 'List Organization Documents'
operationId: listOrganizationDocuments
description: 'Returns all KYC documents for a given organisation for admin review.'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Dokumente erfolgreich abgerufen.'
data:
type: array
examples:
- []
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- e0d196cb-4f23-427c-9c6a-50729a4b0ded
timestamp:
type: string
examples:
- '2026-08-05T16:18:42.237423Z'
examples:
-
status: SUCCESS
message: 'Dokumente erfolgreich abgerufen.'
data: []
errors: null
meta:
request_id: e0d196cb-4f23-427c-9c6a-50729a4b0ded
timestamp: '2026-08-05T16:18:42.237423Z'
tags:
- 'Admin API'
parameters:
-
in: path
name: organization_id
description: 'The ID of the organization.'
required: true
schema:
type: string
examples:
- 019f0593-c95d-73f3-aced-b962c9664f8d
-
in: path
name: organization
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
'/api/v1/admin/organizations/{organization_id}/documents/{document_id}/download':
get:
summary: 'Download Organization Document'
operationId: downloadOrganizationDocument
description: "Streams an organisation's KYC document for admin review. Streaming works on\nany disk (local in dev, S3 in prod), unlike temporary signed URLs which the\nlocal driver cannot generate."
parameters: []
responses:
503:
description: ''
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- ERROR
message:
type: string
examples:
- 'Service Unavailable'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type:
- string
- 'null'
examples:
- null
message:
type: string
examples:
- 'Service Unavailable'
examples:
-
-
field: null
message: 'Service Unavailable'
meta:
type: object
properties:
request_id:
type: string
examples:
- 970f18dd-d6d1-4695-8764-f8d8a246be22
timestamp:
type: string
examples:
- '2026-08-21T05:14:36.064793Z'
examples:
-
status: ERROR
message: 'Service Unavailable'
data: null
errors:
-
field: null
message: 'Service Unavailable'
meta:
request_id: 970f18dd-d6d1-4695-8764-f8d8a246be22
timestamp: '2026-08-21T05:14:36.064793Z'
tags:
- 'Admin API'
parameters:
-
in: path
name: organization_id
description: 'The ID of the organization.'
required: true
schema:
type: string
examples:
- 019f0593-c95d-73f3-aced-b962c9664f8d
-
in: path
name: document_id
description: 'The ID of the document.'
required: true
schema:
type: string
examples:
- 019f34d3-5029-7158-a549-910ae39abad5
-
in: path
name: organization
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
-
in: path
name: document
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
'/api/v1/admin/organizations/{organization_id}/documents/{document_id}/approve':
post:
summary: 'Approve Organization Document'
operationId: approveOrganizationDocument
description: 'Approves a KYC document submitted by an organisation.'
parameters: []
responses: { }
tags:
- 'Admin API'
parameters:
-
in: path
name: organization_id
description: 'The ID of the organization.'
required: true
schema:
type: string
examples:
- 019f0593-c95d-73f3-aced-b962c9664f8d
-
in: path
name: document_id
description: 'The ID of the document.'
required: true
schema:
type: string
examples:
- 019f34d3-5029-7158-a549-910ae39abad5
-
in: path
name: organization
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
-
in: path
name: document
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
'/api/v1/admin/organizations/{organization_id}/documents/{document_id}/reject':
post:
summary: 'Reject Organization Document'
operationId: rejectOrganizationDocument
description: 'Rejects a KYC document submitted by an organisation, with a mandatory reason.'
parameters: []
responses: { }
tags:
- 'Admin API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
reason:
type: string
description: ''
examples:
- 'Krankheitsbedingt kurzfristig abgesagt.'
required:
- reason
parameters:
-
in: path
name: organization_id
description: 'The ID of the organization.'
required: true
schema:
type: string
examples:
- 019f0593-c95d-73f3-aced-b962c9664f8d
-
in: path
name: document_id
description: 'The ID of the document.'
required: true
schema:
type: string
examples:
- 019f34d3-5029-7158-a549-910ae39abad5
-
in: path
name: organization
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
-
in: path
name: document
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
'/api/v1/admin/organizations/{organization_id}/document-requests':
get:
summary: 'List Organization Document Requests'
operationId: listOrganizationDocumentRequests
description: 'Lists all document requests raised for a given organisation.'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Dokumentanforderungen erfolgreich abgerufen.'
data:
type: array
examples:
- []
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 56675c8c-b427-4505-84a4-47ecf293ff7c
timestamp:
type: string
examples:
- '2026-08-05T16:18:42.280175Z'
examples:
-
status: SUCCESS
message: 'Dokumentanforderungen erfolgreich abgerufen.'
data: []
errors: null
meta:
request_id: 56675c8c-b427-4505-84a4-47ecf293ff7c
timestamp: '2026-08-05T16:18:42.280175Z'
tags:
- 'Admin API'
post:
summary: 'Request Organization Documents'
operationId: requestOrganizationDocuments
description: "Raises a new document request for an organisation, optionally specifying\na message and due date."
parameters: []
responses: { }
tags:
- 'Admin API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
document_types:
type: array
description: ''
items:
type: string
examples:
- null
message:
type:
- string
- 'null'
description: ''
examples:
- 'Bitte um Rueckmeldung zur naechsten Schicht.'
due_at:
type:
- date
- 'null'
description: ''
examples:
- '2026-09-30'
required:
- document_types
parameters:
-
in: path
name: organization_id
description: 'The ID of the organization.'
required: true
schema:
type: string
examples:
- 019f0593-c95d-73f3-aced-b962c9664f8d
-
in: path
name: organization
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
'/api/v1/admin/organizations/{organization_id}/document-requests/{documentRequest_id}':
delete:
summary: 'Cancel Organization Document Request'
operationId: cancelOrganizationDocumentRequest
description: 'Withdraws an open document request before the organisation fulfils it.'
parameters: []
responses: { }
tags:
- 'Admin API'
parameters:
-
in: path
name: organization_id
description: 'The ID of the organization.'
required: true
schema:
type: string
examples:
- 019f0593-c95d-73f3-aced-b962c9664f8d
-
in: path
name: documentRequest_id
description: 'The ID of the documentRequest.'
required: true
schema:
type: string
examples:
- 019f37d2-a096-72da-ba50-ba5a5a9674fe
-
in: path
name: organization
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
-
in: path
name: documentRequest
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
/api/v1/admin/employees/pending:
get:
summary: 'List Pending Employees'
operationId: listPendingEmployees
description: 'List employees pending approval.'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
employees:
type: array
items:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-29d1-7181-a321-e1d4deee8590
user_id:
type: string
examples:
- 019fd2b8-29cf-7133-8ff2-ec12d31edb4d
status:
type: string
examples:
- pending_approval
status_label:
type: string
examples:
- 'Genehmigung ausstehend'
profile_completion_percentage:
type: integer
examples:
- 100
svs_number:
type: string
examples:
- '1706010190'
nationality:
type: string
examples:
- AT
city:
type: string
examples:
- 'West Ignatius'
user:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-29cf-7133-8ff2-ec12d31edb4d
name:
type: string
examples:
- 'Chelsey Larkin'
email:
type: string
examples:
- umurphy@example.net
phone:
type:
- string
- 'null'
examples:
- null
created_at:
type: string
examples:
- '2026-08-05 16:18'
updated_at:
type: string
examples:
- '2026-08-05 16:18'
examples:
-
-
id: 019fd2b8-29d1-7181-a321-e1d4deee8590
user_id: 019fd2b8-29cf-7133-8ff2-ec12d31edb4d
status: pending_approval
status_label: 'Genehmigung ausstehend'
profile_completion_percentage: 100
svs_number: '1706010190'
nationality: AT
city: 'West Ignatius'
user:
id: 019fd2b8-29cf-7133-8ff2-ec12d31edb4d
name: 'Chelsey Larkin'
email: umurphy@example.net
phone: null
created_at: '2026-08-05 16:18'
updated_at: '2026-08-05 16:18'
summary:
type: object
properties:
pending_approval:
type: integer
examples:
- 1
correction_required:
type: integer
examples:
- 0
pagination:
type: object
properties:
current_page:
type: integer
examples:
- 1
last_page:
type: integer
examples:
- 1
per_page:
type: integer
examples:
- 20
total:
type: integer
examples:
- 1
examples:
-
status: SUCCESS
data:
employees:
-
id: 019fd2b8-29d1-7181-a321-e1d4deee8590
user_id: 019fd2b8-29cf-7133-8ff2-ec12d31edb4d
status: pending_approval
status_label: 'Genehmigung ausstehend'
profile_completion_percentage: 100
svs_number: '1706010190'
nationality: AT
city: 'West Ignatius'
user:
id: 019fd2b8-29cf-7133-8ff2-ec12d31edb4d
name: 'Chelsey Larkin'
email: umurphy@example.net
phone: null
created_at: '2026-08-05 16:18'
updated_at: '2026-08-05 16:18'
summary:
pending_approval: 1
correction_required: 0
pagination:
current_page: 1
last_page: 1
per_page: 20
total: 1
tags:
- 'Admin API'
'/api/v1/admin/employees/{profileId}/review':
get:
summary: 'Show Employee Review'
operationId: showEmployeeReview
description: "Show an employee's profile for admin review."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
profile:
type: object
properties:
id:
type: string
examples:
- 019fd2b7-f279-7142-a68d-0d4563a06070
user_id:
type: string
examples:
- 019fd2b7-f271-73fd-8268-848be381e136
status:
type: string
examples:
- active
status_label:
type: string
examples:
- Aktiv
status_reason:
type:
- string
- 'null'
examples:
- null
suspended_reason:
type:
- string
- 'null'
examples:
- null
suspended_until:
type:
- string
- 'null'
examples:
- null
profile_completion_percentage:
type: integer
examples:
- 0
svs_number:
type: string
examples:
- '5678200895'
date_of_birth:
type: string
examples:
- '1995-08-20'
place_of_birth:
type:
- string
- 'null'
examples:
- null
nationality:
type: string
examples:
- AT
gender:
type:
- string
- 'null'
examples:
- null
legal_first_name:
type:
- string
- 'null'
examples:
- null
legal_last_name:
type:
- string
- 'null'
examples:
- null
middle_names:
type:
- string
- 'null'
examples:
- null
previous_last_names:
type:
- string
- 'null'
examples:
- null
citizenship_primary:
type:
- string
- 'null'
examples:
- null
citizenship_additional:
type:
- string
- 'null'
examples:
- null
residence_status:
type:
- string
- 'null'
examples:
- null
residence_status_label:
type:
- string
- 'null'
examples:
- null
country_of_birth:
type:
- string
- 'null'
examples:
- null
tax_id_set:
type: boolean
examples:
- false
tax_number_set:
type: boolean
examples:
- false
finanz_online_registered:
type: boolean
examples:
- false
alternate_email:
type:
- string
- 'null'
examples:
- null
street:
type: string
examples:
- 'Neugasse 5'
house_number:
type:
- string
- 'null'
examples:
- null
postal_code:
type: string
examples:
- '4020'
city:
type: string
examples:
- Linz
country:
type: string
examples:
- AT
correction_fields:
type:
- string
- 'null'
examples:
- null
profile_picture_url:
type:
- string
- 'null'
examples:
- null
preferred_radius_km:
type:
- string
- 'null'
examples:
- null
bio:
type:
- string
- 'null'
examples:
- null
marketing_consent:
type:
- string
- 'null'
examples:
- null
gdpr_consent:
type:
- string
- 'null'
examples:
- null
created_at:
type: string
examples:
- '2026-08-05 16:18'
updated_at:
type: string
examples:
- '2026-08-05 16:18'
user:
type: object
properties:
id:
type: string
examples:
- 019fd2b7-f271-73fd-8268-848be381e136
first_name:
type: string
examples:
- Anna
last_name:
type: string
examples:
- Neuling
email:
type: string
examples:
- pending@demo.flexxr.at
phone:
type: string
examples:
- '+436769876543'
email_verified:
type: boolean
examples:
- true
documents:
type: array
items:
type: object
properties:
id:
type: string
examples:
- 019fd2b7-f280-73fe-83af-4fdd5f9db332
type:
type: string
examples:
- id_card
type_label:
type: string
examples:
- 'ID card'
filename:
type: string
examples:
- ausweis.pdf
file_url:
type: string
examples:
- /storage/documents/demo/ausweis.pdf
thumbnail_url:
type:
- string
- 'null'
examples:
- null
status:
type: string
examples:
- pending
status_label:
type: string
examples:
- Ausstehend
rejection_reason:
type:
- string
- 'null'
examples:
- null
expires_at:
type:
- string
- 'null'
examples:
- null
is_expired:
type: boolean
examples:
- false
virus_scanned_at:
type:
- string
- 'null'
examples:
- null
ocr_name_match_score:
type:
- string
- 'null'
examples:
- null
ocr_confidence:
type:
- string
- 'null'
examples:
- null
needs_review:
type: boolean
examples:
- false
discrepancies:
type: array
examples:
- []
created_at:
type: string
examples:
- '2026-08-05 16:18'
examples:
-
-
id: 019fd2b7-f280-73fe-83af-4fdd5f9db332
type: id_card
type_label: 'ID card'
filename: ausweis.pdf
file_url: /storage/documents/demo/ausweis.pdf
thumbnail_url: null
status: pending
status_label: Ausstehend
rejection_reason: null
expires_at: null
is_expired: false
virus_scanned_at: null
ocr_name_match_score: null
ocr_confidence: null
needs_review: false
discrepancies: []
created_at: '2026-08-05 16:18'
-
id: 019fd2b8-28ce-735c-aa32-c03c49655e69
type: passport
type_label: Passport
filename: veniam.pdf
file_url: /storage/employee/917d038a-c64d-30e4-8416-39aca59dc516/passport/2026/06/13/29374d0b-28b0-36d0-9ee2-bac06a7bb554.pdf
thumbnail_url: null
status: verified
status_label: Verifiziert
rejection_reason: null
expires_at: '2033-05-22'
is_expired: false
virus_scanned_at: null
ocr_name_match_score: null
ocr_confidence: null
needs_review: false
discrepancies: []
created_at: '2026-08-05 16:18'
qualifications:
type: array
examples:
- []
bank_accounts:
type: array
examples:
- []
emergency_contacts:
type: array
examples:
- []
checklist:
type: object
properties:
email_verified:
type: boolean
examples:
- true
id_document_uploaded:
type: boolean
examples:
- true
bank_account_added:
type: boolean
examples:
- false
svs_number_provided:
type: boolean
examples:
- true
profile_complete:
type: boolean
examples:
- false
work_permit_valid:
type: boolean
examples:
- true
work_permit:
type: object
properties:
required:
type: boolean
examples:
- false
expires_at:
type:
- string
- 'null'
examples:
- null
is_expired:
type: boolean
examples:
- false
days_until_expiry:
type:
- string
- 'null'
examples:
- null
shifts:
type: array
items:
type: object
properties:
assignment:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-28d3-70d7-92eb-f1bb1577acaf
status:
type: string
examples:
- signed
status_label:
type: string
examples:
- Unterschrieben
shift_date:
type: string
examples:
- '2026-08-06'
scheduled_start_time:
type: string
examples:
- '08:00:00'
scheduled_end_time:
type: string
examples:
- '16:00:00'
location_name:
type: string
examples:
- Nolan-Roberts
location_address:
type: string
examples:
- "4309 O'Reilly Way Suite 012"
hourly_rate_gross:
type: string
examples:
- '34.72'
started_at:
type:
- string
- 'null'
examples:
- null
completed_at:
type:
- string
- 'null'
examples:
- null
job:
type: object
properties:
id:
type: string
examples: [019fd2b8-28c4-732f-a94c-fb5a71a7d682]
title:
type: string
examples: [Accountant]
employee:
type: object
properties:
id:
type: string
examples: [019fd2b7-f271-73fd-8268-848be381e136]
name:
type: string
examples: ['Anna Neuling']
contract:
type:
- string
- 'null'
examples:
- null
attendance:
type:
- string
- 'null'
examples:
- null
rating:
type:
- string
- 'null'
examples:
- null
timeline:
type: array
items:
type: object
properties:
event_type:
type: string
examples:
- assignment.created
actor:
type: string
examples:
- system
title:
type: string
examples:
- 'Assignment created'
description:
type: string
examples:
- 'Assignment was created from job selection.'
occurred_at:
type: string
examples:
- '2026-08-05T16:18:32+00:00'
path:
type: string
examples:
- /hours
examples:
-
-
event_type: assignment.created
actor: system
title: 'Assignment created'
description: 'Assignment was created from job selection.'
occurred_at: '2026-08-05T16:18:32+00:00'
path: /hours
examples:
-
-
assignment:
id: 019fd2b8-28d3-70d7-92eb-f1bb1577acaf
status: signed
status_label: Unterschrieben
shift_date: '2026-08-06'
scheduled_start_time: '08:00:00'
scheduled_end_time: '16:00:00'
location_name: Nolan-Roberts
location_address: "4309 O'Reilly Way Suite 012"
hourly_rate_gross: '34.72'
started_at: null
completed_at: null
job:
id: 019fd2b8-28c4-732f-a94c-fb5a71a7d682
title: Accountant
employee:
id: 019fd2b7-f271-73fd-8268-848be381e136
name: 'Anna Neuling'
contract: null
attendance: null
rating: null
timeline:
-
event_type: assignment.created
actor: system
title: 'Assignment created'
description: 'Assignment was created from job selection.'
occurred_at: '2026-08-05T16:18:32+00:00'
path: /hours
-
assignment:
id: 019fd2b8-28d8-728d-a447-8de1a42eec83
status: checked_in
status_label: Eingecheckt
shift_date: '2026-08-05'
scheduled_start_time: '11:58:00'
scheduled_end_time: '12:13:00'
location_name: 'Goldner and Sons'
location_address: '30005 Prosacco Orchard'
hourly_rate_gross: '18.57'
started_at: null
completed_at: null
job:
id: 019fd2b8-28c4-732f-a94c-fb5a71a7d682
title: Accountant
employee:
id: 019fd2b7-f271-73fd-8268-848be381e136
name: 'Anna Neuling'
contract: null
attendance: null
rating: null
timeline:
-
event_type: assignment.created
actor: system
title: 'Assignment created'
description: 'Assignment was created from job selection.'
occurred_at: '2026-08-05T16:18:32+00:00'
path: /hours
-
assignment:
id: 019fd2b8-28d1-7112-b8e9-68bd79fbafb9
status: awaiting_signature
status_label: 'Unterschrift ausstehend'
shift_date: '2026-08-04'
scheduled_start_time: '16:57:00'
scheduled_end_time: '09:21:00'
location_name: Buckridge-Collier
location_address: '661 Cayla Unions Suite 344'
hourly_rate_gross: '27.68'
started_at: null
completed_at: null
job:
id: 019fd2b8-28c4-732f-a94c-fb5a71a7d682
title: Accountant
employee:
id: 019fd2b7-f271-73fd-8268-848be381e136
name: 'Anna Neuling'
contract: null
attendance: null
rating: null
timeline:
-
event_type: assignment.created
actor: system
title: 'Assignment created'
description: 'Assignment was created from job selection.'
occurred_at: '2026-08-05T16:18:32+00:00'
path: /hours
-
assignment:
id: 019fd2b8-28df-7265-8b1e-cb5de026e4d7
status: completed
status_label: Abgeschlossen
shift_date: '2026-08-03'
scheduled_start_time: '08:31:00'
scheduled_end_time: '05:12:00'
location_name: 'Wehner Inc'
location_address: '45222 Hansen Gardens'
hourly_rate_gross: '18.25'
started_at: null
completed_at: null
job:
id: 019fd2b8-28c4-732f-a94c-fb5a71a7d682
title: Accountant
employee:
id: 019fd2b7-f271-73fd-8268-848be381e136
name: 'Anna Neuling'
contract: null
attendance: null
rating: null
timeline:
-
event_type: assignment.created
actor: system
title: 'Assignment created'
description: 'Assignment was created from job selection.'
occurred_at: '2026-08-05T16:18:32+00:00'
path: /hours
examples:
-
status: SUCCESS
data:
profile:
id: 019fd2b7-f279-7142-a68d-0d4563a06070
user_id: 019fd2b7-f271-73fd-8268-848be381e136
status: active
status_label: Aktiv
status_reason: null
suspended_reason: null
suspended_until: null
profile_completion_percentage: 0
svs_number: '5678200895'
date_of_birth: '1995-08-20'
place_of_birth: null
nationality: AT
gender: null
legal_first_name: null
legal_last_name: null
middle_names: null
previous_last_names: null
citizenship_primary: null
citizenship_additional: null
residence_status: null
residence_status_label: null
country_of_birth: null
tax_id_set: false
tax_number_set: false
finanz_online_registered: false
alternate_email: null
street: 'Neugasse 5'
house_number: null
postal_code: '4020'
city: Linz
country: AT
correction_fields: null
profile_picture_url: null
preferred_radius_km: null
bio: null
marketing_consent: null
gdpr_consent: null
created_at: '2026-08-05 16:18'
updated_at: '2026-08-05 16:18'
user:
id: 019fd2b7-f271-73fd-8268-848be381e136
first_name: Anna
last_name: Neuling
email: pending@demo.flexxr.at
phone: '+436769876543'
email_verified: true
documents:
-
id: 019fd2b7-f280-73fe-83af-4fdd5f9db332
type: id_card
type_label: 'ID card'
filename: ausweis.pdf
file_url: /storage/documents/demo/ausweis.pdf
thumbnail_url: null
status: pending
status_label: Ausstehend
rejection_reason: null
expires_at: null
is_expired: false
virus_scanned_at: null
ocr_name_match_score: null
ocr_confidence: null
needs_review: false
discrepancies: []
created_at: '2026-08-05 16:18'
-
id: 019fd2b8-28ce-735c-aa32-c03c49655e69
type: passport
type_label: Passport
filename: veniam.pdf
file_url: /storage/employee/917d038a-c64d-30e4-8416-39aca59dc516/passport/2026/06/13/29374d0b-28b0-36d0-9ee2-bac06a7bb554.pdf
thumbnail_url: null
status: verified
status_label: Verifiziert
rejection_reason: null
expires_at: '2033-05-22'
is_expired: false
virus_scanned_at: null
ocr_name_match_score: null
ocr_confidence: null
needs_review: false
discrepancies: []
created_at: '2026-08-05 16:18'
qualifications: []
bank_accounts: []
emergency_contacts: []
checklist:
email_verified: true
id_document_uploaded: true
bank_account_added: false
svs_number_provided: true
profile_complete: false
work_permit_valid: true
work_permit:
required: false
expires_at: null
is_expired: false
days_until_expiry: null
shifts:
-
assignment:
id: 019fd2b8-28d3-70d7-92eb-f1bb1577acaf
status: signed
status_label: Unterschrieben
shift_date: '2026-08-06'
scheduled_start_time: '08:00:00'
scheduled_end_time: '16:00:00'
location_name: Nolan-Roberts
location_address: "4309 O'Reilly Way Suite 012"
hourly_rate_gross: '34.72'
started_at: null
completed_at: null
job:
id: 019fd2b8-28c4-732f-a94c-fb5a71a7d682
title: Accountant
employee:
id: 019fd2b7-f271-73fd-8268-848be381e136
name: 'Anna Neuling'
contract: null
attendance: null
rating: null
timeline:
-
event_type: assignment.created
actor: system
title: 'Assignment created'
description: 'Assignment was created from job selection.'
occurred_at: '2026-08-05T16:18:32+00:00'
path: /hours
-
assignment:
id: 019fd2b8-28d8-728d-a447-8de1a42eec83
status: checked_in
status_label: Eingecheckt
shift_date: '2026-08-05'
scheduled_start_time: '11:58:00'
scheduled_end_time: '12:13:00'
location_name: 'Goldner and Sons'
location_address: '30005 Prosacco Orchard'
hourly_rate_gross: '18.57'
started_at: null
completed_at: null
job:
id: 019fd2b8-28c4-732f-a94c-fb5a71a7d682
title: Accountant
employee:
id: 019fd2b7-f271-73fd-8268-848be381e136
name: 'Anna Neuling'
contract: null
attendance: null
rating: null
timeline:
-
event_type: assignment.created
actor: system
title: 'Assignment created'
description: 'Assignment was created from job selection.'
occurred_at: '2026-08-05T16:18:32+00:00'
path: /hours
-
assignment:
id: 019fd2b8-28d1-7112-b8e9-68bd79fbafb9
status: awaiting_signature
status_label: 'Unterschrift ausstehend'
shift_date: '2026-08-04'
scheduled_start_time: '16:57:00'
scheduled_end_time: '09:21:00'
location_name: Buckridge-Collier
location_address: '661 Cayla Unions Suite 344'
hourly_rate_gross: '27.68'
started_at: null
completed_at: null
job:
id: 019fd2b8-28c4-732f-a94c-fb5a71a7d682
title: Accountant
employee:
id: 019fd2b7-f271-73fd-8268-848be381e136
name: 'Anna Neuling'
contract: null
attendance: null
rating: null
timeline:
-
event_type: assignment.created
actor: system
title: 'Assignment created'
description: 'Assignment was created from job selection.'
occurred_at: '2026-08-05T16:18:32+00:00'
path: /hours
-
assignment:
id: 019fd2b8-28df-7265-8b1e-cb5de026e4d7
status: completed
status_label: Abgeschlossen
shift_date: '2026-08-03'
scheduled_start_time: '08:31:00'
scheduled_end_time: '05:12:00'
location_name: 'Wehner Inc'
location_address: '45222 Hansen Gardens'
hourly_rate_gross: '18.25'
started_at: null
completed_at: null
job:
id: 019fd2b8-28c4-732f-a94c-fb5a71a7d682
title: Accountant
employee:
id: 019fd2b7-f271-73fd-8268-848be381e136
name: 'Anna Neuling'
contract: null
attendance: null
rating: null
timeline:
-
event_type: assignment.created
actor: system
title: 'Assignment created'
description: 'Assignment was created from job selection.'
occurred_at: '2026-08-05T16:18:32+00:00'
path: /hours
tags:
- 'Admin API'
parameters:
-
in: path
name: profileId
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
'/api/v1/admin/employees/{profileId}/approve':
post:
summary: 'Approve Employee'
operationId: approveEmployee
description: "Approve an employee's profile."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'The employee has been approved successfully.'
data:
type: object
properties:
employee_id:
type: string
examples:
- 019fd2b8-29d1-7181-a321-e1d4deee8590
status:
type: string
examples:
- active
examples:
-
status: SUCCESS
message: 'The employee has been approved successfully.'
data:
employee_id: 019fd2b8-29d1-7181-a321-e1d4deee8590
status: active
tags:
- 'Admin API'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
note:
type: string
description: ''
examples:
- Beispieltext
parameters:
-
in: path
name: profileId
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
'/api/v1/admin/employees/{profileId}/reject':
post:
summary: 'Reject Employee'
operationId: rejectEmployee
description: "Reject an employee's application."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'The employee application has been rejected.'
data:
type: object
properties:
employee_id:
type: string
examples:
- 019fd2b8-29d1-7181-a321-e1d4deee8590
status:
type: string
examples:
- rejected
examples:
-
status: SUCCESS
message: 'The employee application has been rejected.'
data:
employee_id: 019fd2b8-29d1-7181-a321-e1d4deee8590
status: rejected
tags:
- 'Admin API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
reason:
type: string
description: ''
examples:
- 'Krankheitsbedingt kurzfristig abgesagt.'
reason_code:
type: string
description: 'Allowed: documents_invalid, identity_mismatch, sanctions_match, other.'
examples:
- documents_invalid
required:
- reason
- reason_code
parameters:
-
in: path
name: profileId
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
'/api/v1/admin/employees/{profileId}/request-correction':
post:
summary: 'Request Correction'
operationId: requestCorrection
description: 'Request correction from employee before approval.'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Correction request has been sent to the employee.'
data:
type: object
properties:
employee_id:
type: string
examples:
- 019fd2b8-29d1-7181-a321-e1d4deee8590
status:
type: string
examples:
- correction_required
examples:
-
status: SUCCESS
message: 'Correction request has been sent to the employee.'
data:
employee_id: 019fd2b8-29d1-7181-a321-e1d4deee8590
status: correction_required
tags:
- 'Admin API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
reason:
type: string
description: ''
examples:
- 'Krankheitsbedingt kurzfristig abgesagt.'
fields_requiring_correction:
type: array
description: ''
items:
type: string
examples:
- null
required:
- reason
parameters:
-
in: path
name: profileId
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
'/api/v1/admin/employees/documents/{documentId}/approve':
post:
summary: 'Approve Document'
operationId: approveDocument
description: 'Approve (verify) an employee document during admin review.'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'The document has been verified.'
data:
type: object
properties:
document_id:
type: string
examples:
- 019fd2b8-6103-7134-bdc4-ac4ec15c8ab5
status:
type: string
examples:
- verified
examples:
-
status: SUCCESS
message: 'The document has been verified.'
data:
document_id: 019fd2b8-6103-7134-bdc4-ac4ec15c8ab5
status: verified
tags:
- 'Admin API'
parameters:
-
in: path
name: documentId
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
'/api/v1/admin/employees/documents/{documentId}/reject':
post:
summary: 'Reject Document'
operationId: rejectDocument
description: "Reject an employee document during admin review. A reason is mandatory\nand is surfaced to the employee so they know what to fix."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'The document has been rejected.'
data:
type: object
properties:
document_id:
type: string
examples:
- 019fd2b8-6352-7026-9ee5-f2087fc25f75
status:
type: string
examples:
- rejected
rejection_reason:
type: string
examples:
- 'Das Dokument ist unleserlich. Bitte erneut hochladen.'
examples:
-
status: SUCCESS
message: 'The document has been rejected.'
data:
document_id: 019fd2b8-6352-7026-9ee5-f2087fc25f75
status: rejected
rejection_reason: 'Das Dokument ist unleserlich. Bitte erneut hochladen.'
tags:
- 'Admin API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
reason:
type: string
description: ''
examples:
- 'Krankheitsbedingt kurzfristig abgesagt.'
required:
- reason
parameters:
-
in: path
name: documentId
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
'/api/v1/admin/employees/qualifications/{qualificationId}/verify':
post:
summary: 'Verify Qualification'
operationId: verifyQualification
description: "Marks a worker's self-reported qualification as verified. Until an admin\ndoes this the qualification counts as the worker's own claim — the\nmobile app shows it without the verified badge.\n\nAn expired qualification cannot be verified: what would be confirmed is\nno longer in force."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'The qualification has been verified.'
data:
type: object
properties:
qualification_id:
type: string
examples:
- 019fd41b-439a-727b-bdab-d37f8d7ca5f0
is_verified:
type: boolean
examples:
- true
examples:
-
status: SUCCESS
message: 'The qualification has been verified.'
data:
qualification_id: 019fd41b-439a-727b-bdab-d37f8d7ca5f0
is_verified: true
422:
description: 'Already expired'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- INVALID_OPERATION
message:
type: string
examples:
- 'Diese Qualifikation ist abgelaufen. Bitte erneuern Sie sie.'
examples:
-
status: INVALID_OPERATION
message: 'Diese Qualifikation ist abgelaufen. Bitte erneuern Sie sie.'
tags:
- 'Admin API'
parameters:
-
in: path
name: qualificationId
description: 'Identifier from the employee review.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
'/api/v1/admin/employees/qualifications/{qualificationId}/reject':
post:
summary: 'Reject Qualification'
operationId: rejectQualification
description: "Refuses to verify a qualification — or withdraws a verification already\ngiven, when it turns out to have been wrong. The row stays on the\nworker's profile as their own claim; the reason is sent to them so they\nknow what to fix."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Verification of the qualification has been declined.'
data:
type: object
properties:
qualification_id:
type: string
examples:
- 019fd41b-439a-727b-bdab-d37f8d7ca5f0
is_verified:
type: boolean
examples:
- false
examples:
-
status: SUCCESS
message: 'Verification of the qualification has been declined.'
data:
qualification_id: 019fd41b-439a-727b-bdab-d37f8d7ca5f0
is_verified: false
tags:
- 'Admin API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
reason:
type: string
description: 'Why verification is refused, shown to the worker.'
examples:
- 'Der Nachweis ist nicht lesbar.'
required:
- reason
parameters:
-
in: path
name: qualificationId
description: 'Identifier from the employee review.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
/api/v1/admin/jobs:
get:
summary: 'List All Jobs'
operationId: listAllJobs
description: 'List all job listings across all organizations for admin oversight.'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
jobs:
type: array
items:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-28e8-73a4-94d6-5a423c21f064
title:
type: string
examples:
- 'Foundry Mold and Coremaker'
organization:
type: object
properties:
id:
type: string
examples:
- 019fd2b7-f072-7154-8961-5b324cc6c46c
name:
type: string
examples:
- Caritas
status:
type: string
examples:
- active
category:
type: string
examples:
- software
category_label:
type: string
examples:
- Software
status:
type: string
examples:
- draft
status_label:
type: string
examples:
- Entwurf
status_color:
type: string
examples:
- gray
location_city:
type: string
examples:
- 'South Zachery'
start_date:
type: string
examples:
- '2026-08-29'
end_date:
type: string
examples:
- '2026-09-25'
shift_start_time:
type: string
examples:
- '16:30:00'
shift_end_time:
type: string
examples:
- '14:33:00'
total_vacancies:
type: integer
examples:
- 10
filled_vacancies:
type: integer
examples:
- 0
hourly_rate_gross:
type: number
examples:
- 29.86
applications_count:
type: integer
examples:
- 0
shifts_count:
type: integer
examples:
- 0
has_compliance_warning:
type: boolean
examples:
- false
is_deleted:
type: boolean
examples:
- false
created_at:
type: string
examples:
- '2026-08-05T16:18:32+00:00'
examples:
-
-
id: 019fd2b8-28e8-73a4-94d6-5a423c21f064
title: 'Foundry Mold and Coremaker'
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
status: active
category: software
category_label: Software
status: draft
status_label: Entwurf
status_color: gray
location_city: 'South Zachery'
start_date: '2026-08-29'
end_date: '2026-09-25'
shift_start_time: '16:30:00'
shift_end_time: '14:33:00'
total_vacancies: 10
filled_vacancies: 0
hourly_rate_gross: 29.86
applications_count: 0
shifts_count: 0
has_compliance_warning: false
is_deleted: false
created_at: '2026-08-05T16:18:32+00:00'
-
id: 019fd2b8-28c4-732f-a94c-fb5a71a7d682
title: Accountant
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
status: active
category: office
category_label: Büro
status: active
status_label: Aktiv
status_color: green
location_city: 'East Eliseo'
start_date: '2026-08-12'
end_date: '2026-08-19'
shift_start_time: '01:49:00'
shift_end_time: '18:57:00'
total_vacancies: 5
filled_vacancies: 0
hourly_rate_gross: 32.08
applications_count: 1
shifts_count: 4
has_compliance_warning: false
is_deleted: false
created_at: '2026-08-05T16:18:32+00:00'
-
id: 019fd2b8-28ee-71e0-b50d-2c303c17f728
title: 'Kindergarten Teacher'
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
status: active
category: warehouse
category_label: Lager
status: pending_review
status_label: 'In Prüfung'
status_color: yellow
location_city: Eldahaven
start_date: '2026-08-21'
end_date: '2026-09-15'
shift_start_time: '06:44:00'
shift_end_time: '06:04:00'
total_vacancies: 1
filled_vacancies: 0
hourly_rate_gross: 18.4
applications_count: 0
shifts_count: 0
has_compliance_warning: false
is_deleted: false
created_at: '2026-08-05T16:18:32+00:00'
-
id: 019fd2b8-2705-73fd-a401-002956f1f401
title: 'Fahrer*in Zustelldienst Wien Nord'
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
status: active
category: logistics
category_label: Logistik
status: published
status_label: Aktiv
status_color: green
location_city: Wien
start_date: '2026-08-14'
end_date: '2026-08-15'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
total_vacancies: 4
filled_vacancies: 0
hourly_rate_gross: 15
applications_count: 0
shifts_count: 0
has_compliance_warning: false
is_deleted: false
created_at: '2026-08-05T16:18:31+00:00'
-
id: 019fd2b8-2599-7355-a7f1-dcb185b05faa
title: 'Rezeptionist*in Hotel Sacher'
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
status: active
category: hotel
category_label: Hotellerie
status: published
status_label: Aktiv
status_color: green
location_city: Wien
start_date: '2026-08-17'
end_date: '2026-08-19'
shift_start_time: '09:00:00'
shift_end_time: '17:00:00'
total_vacancies: 4
filled_vacancies: 0
hourly_rate_gross: 17.5
applications_count: 51
shifts_count: 0
has_compliance_warning: false
is_deleted: false
created_at: '2026-08-05T16:18:31+00:00'
-
id: 019fd2b8-24b0-700a-ae2a-142f5e48aead
title: 'Lagerhelfer*in Logistikzentrum Inzersdorf'
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
status: active
category: warehouse
category_label: Lager
status: published
status_label: Aktiv
status_color: green
location_city: Wien
start_date: '2026-08-12'
end_date: '2026-08-14'
shift_start_time: '22:00:00'
shift_end_time: '06:00:00'
total_vacancies: 15
filled_vacancies: 0
hourly_rate_gross: 14.8
applications_count: 29
shifts_count: 0
has_compliance_warning: false
is_deleted: false
created_at: '2026-08-05T16:18:31+00:00'
-
id: 019fd2b8-270a-71f9-a13c-ef188105041c
title: 'Reinigungskraft Hotel Ibis Mariahilf'
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
status: active
category: cleaning
category_label: Reinigung
status: published
status_label: Aktiv
status_color: green
location_city: Wien
start_date: '2026-08-16'
end_date: '2026-08-17'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
total_vacancies: 3
filled_vacancies: 0
hourly_rate_gross: 13.2
applications_count: 0
shifts_count: 0
has_compliance_warning: false
is_deleted: false
created_at: '2026-08-05T16:18:31+00:00'
-
id: 019fd2b8-26fb-7142-b3a3-df10c3591584
title: 'Küchenhilfe Streetfood Festival Naschmarkt'
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
status: active
category: catering
category_label: Catering
status: published
status_label: Aktiv
status_color: green
location_city: Wien
start_date: '2026-08-13'
end_date: '2026-08-14'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
total_vacancies: 6
filled_vacancies: 0
hourly_rate_gross: 13
applications_count: 0
shifts_count: 0
has_compliance_warning: false
is_deleted: false
created_at: '2026-08-05T16:18:31+00:00'
-
id: 019fd2b8-270f-715d-a3a0-76c4c314e3ff
title: 'Verkäufer*in Elektronik Mediamarkt Vösendorf'
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
status: active
category: retail
category_label: Einzelhandel
status: published
status_label: Aktiv
status_color: green
location_city: Vösendorf
start_date: '2026-08-20'
end_date: '2026-08-21'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
total_vacancies: 7
filled_vacancies: 0
hourly_rate_gross: 14
applications_count: 0
shifts_count: 0
has_compliance_warning: false
is_deleted: false
created_at: '2026-08-05T16:18:31+00:00'
-
id: 019fd2b8-2700-724b-adc5-2be8957e0590
title: 'Kassierer*in Supermarkt Floridsdorf'
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
status: active
category: supermarket
category_label: Lebensmittelhandel
status: published
status_label: Aktiv
status_color: green
location_city: Wien
start_date: '2026-08-11'
end_date: '2026-08-12'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
total_vacancies: 5
filled_vacancies: 0
hourly_rate_gross: 13.5
applications_count: 0
shifts_count: 0
has_compliance_warning: false
is_deleted: false
created_at: '2026-08-05T16:18:31+00:00'
-
id: 019fd2b8-21c8-72cc-80b1-47fd13450522
title: 'Barkeeper*in Sommernacht Open Air'
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
status: active
category: gastro
category_label: Gastronomie
status: published
status_label: Aktiv
status_color: green
location_city: Wien
start_date: '2026-08-15'
end_date: '2026-08-17'
shift_start_time: '22:00:00'
shift_end_time: '06:00:00'
total_vacancies: 8
filled_vacancies: 0
hourly_rate_gross: 16
applications_count: 38
shifts_count: 0
has_compliance_warning: false
is_deleted: false
created_at: '2026-08-05T16:18:30+00:00'
-
id: 019fd2b8-22cf-71c5-8edd-5e3ce9d29e8b
title: 'Promoter*in Vienna Marathon'
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
status: active
category: event
category_label: Events
status: published
status_label: Aktiv
status_color: green
location_city: Wien
start_date: '2026-08-26'
end_date: '2026-08-28'
shift_start_time: '09:00:00'
shift_end_time: '17:00:00'
total_vacancies: 20
filled_vacancies: 0
hourly_rate_gross: 13.5
applications_count: 62
shifts_count: 0
has_compliance_warning: false
is_deleted: false
created_at: '2026-08-05T16:18:30+00:00'
-
id: 019fd2b8-1f86-7376-9a3a-c072ab5675cb
title: 'Service-Mitarbeiter*in Wiener Prater Festival'
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
status: active
category: gastro
category_label: Gastronomie
status: published
status_label: Aktiv
status_color: green
location_city: Wien
start_date: '2026-08-19'
end_date: '2026-08-21'
shift_start_time: '09:00:00'
shift_end_time: '17:00:00'
total_vacancies: 12
filled_vacancies: 0
hourly_rate_gross: 15.5
applications_count: 45
shifts_count: 0
has_compliance_warning: false
is_deleted: false
created_at: '2026-08-05T16:18:29+00:00'
-
id: 019fd2b8-1dcd-734a-a041-f809f58e95fb
title: 'IT Supportkraft Vertretung'
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
status: active
category: it_services
category_label: 'IT Services'
status: pending_review
status_label: 'In Prüfung'
status_color: yellow
location_city: Wien
start_date: '2026-08-20'
end_date: '2026-09-04'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
total_vacancies: 2
filled_vacancies: 0
hourly_rate_gross: 22
applications_count: 0
shifts_count: 0
has_compliance_warning: false
is_deleted: false
created_at: '2026-08-05T16:18:29+00:00'
-
id: 019fd2b8-1dc8-7078-bcc2-07c7297ffa47
title: 'Nachtschicht Lager Q4'
organization:
id: 019fd2b7-f91f-70cb-8409-8632db9df3c7
name: 'Sicherheitsdienst Österreich'
status: active
category: logistics
category_label: Logistik
status: draft
status_label: Entwurf
status_color: gray
location_city: Graz
start_date: '2026-12-03'
end_date: '2027-02-01'
shift_start_time: '22:00:00'
shift_end_time: '06:00:00'
total_vacancies: 20
filled_vacancies: 0
hourly_rate_gross: 15.5
applications_count: 0
shifts_count: 0
has_compliance_warning: false
is_deleted: false
created_at: '2026-08-05T16:18:29+00:00'
-
id: 019fd2b8-1d92-7277-aa77-7172270002a5
title: 'Qualitätskontrolle Lebensmittel'
organization:
id: 019fd2b7-f4d3-71a1-89d4-ca7d5731b32a
name: 'Wiener Gastro GmbH'
status: active
category: production
category_label: Produktion
status: active
status_label: Aktiv
status_color: green
location_city: Graz
start_date: '2026-08-08'
end_date: '2026-10-04'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
total_vacancies: 4
filled_vacancies: 0
hourly_rate_gross: 15.5
applications_count: 8
shifts_count: 2
has_compliance_warning: false
is_deleted: false
created_at: '2026-08-05T16:18:29+00:00'
-
id: 019fd2b8-1dc6-72cc-acac-502231efcb6b
title: 'Messehostess Herbstmesse'
organization:
id: 019fd2b7-f91f-70cb-8409-8632db9df3c7
name: 'Sicherheitsdienst Österreich'
status: active
category: event
category_label: Events
status: draft
status_label: Entwurf
status_color: gray
location_city: Wien
start_date: '2026-11-03'
end_date: '2026-11-08'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
total_vacancies: 10
filled_vacancies: 0
hourly_rate_gross: 14
applications_count: 0
shifts_count: 0
has_compliance_warning: false
is_deleted: false
created_at: '2026-08-05T16:18:29+00:00'
-
id: 019fd2b8-1dcb-73f4-9257-e7fa42fe8514
title: 'Sommerfest Catering'
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
status: active
category: catering
category_label: Catering
status: pending_review
status_label: 'In Prüfung'
status_color: yellow
location_city: Wien
start_date: '2026-09-24'
end_date: '2026-09-25'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
total_vacancies: 12
filled_vacancies: 0
hourly_rate_gross: 15
applications_count: 0
shifts_count: 0
has_compliance_warning: false
is_deleted: false
created_at: '2026-08-05T16:18:29+00:00'
-
id: 019fd2b8-1d1e-7188-9438-b0d6050c492a
title: 'Kursleiter*in Deutschkurs'
organization:
id: 019fd2b8-00e8-7186-8fa6-5b042a30b10d
name: 'Transport & Spedition GmbH'
status: active
category: education
category_label: Bildung
status: active
status_label: Aktiv
status_color: green
location_city: Wien
start_date: '2026-08-12'
end_date: '2026-11-03'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
total_vacancies: 3
filled_vacancies: 0
hourly_rate_gross: 18
applications_count: 6
shifts_count: 2
has_compliance_warning: false
is_deleted: false
created_at: '2026-08-05T16:18:29+00:00'
-
id: 019fd2b8-1d4e-71d9-aad9-3d9f47a96e48
title: 'Ausstellungsführer Museum'
organization:
id: 019fd2b7-fbb4-73fa-b801-e0c8a8de2651
name: 'Bauwerk GmbH'
status: active
category: education
category_label: Bildung
status: active
status_label: Aktiv
status_color: green
location_city: Wien
start_date: '2026-08-15'
end_date: '2027-02-01'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
total_vacancies: 4
filled_vacancies: 0
hourly_rate_gross: 15
applications_count: 7
shifts_count: 1
has_compliance_warning: false
is_deleted: false
created_at: '2026-08-05T16:18:29+00:00'
-
id: 019fd2b8-1ce9-736a-9a61-22cea78283c9
title: 'Support-Techniker Außeneinsatz'
organization:
id: 019fd2b7-f91f-70cb-8409-8632db9df3c7
name: 'Sicherheitsdienst Österreich'
status: active
category: it_services
category_label: 'IT Services'
status: active
status_label: Aktiv
status_color: green
location_city: Graz
start_date: '2026-08-12'
end_date: '2026-10-04'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
total_vacancies: 2
filled_vacancies: 0
hourly_rate_gross: 20
applications_count: 4
shifts_count: 2
has_compliance_warning: false
is_deleted: false
created_at: '2026-08-05T16:18:29+00:00'
-
id: 019fd2b8-1d3f-7297-8384-35d386f1454b
title: 'Schulassistenz Volksschule'
organization:
id: 019fd2b7-f5ae-7390-a778-c08c8d56cdc0
name: 'Event Solutions Austria'
status: active
category: education
category_label: Bildung
status: active
status_label: Aktiv
status_color: green
location_city: Wien
start_date: '2026-08-08'
end_date: '2026-11-03'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
total_vacancies: 2
filled_vacancies: 0
hourly_rate_gross: 15.5
applications_count: 3
shifts_count: 1
has_compliance_warning: false
is_deleted: false
created_at: '2026-08-05T16:18:29+00:00'
-
id: 019fd2b8-1ccb-7322-8d33-448afd9b027b
title: 'Testingenieur Vertretung'
organization:
id: 019fd2b7-f842-71ba-a318-a919a24d4bcf
name: 'Hotel & Spa Imperial'
status: active
category: it_services
category_label: 'IT Services'
status: active
status_label: Aktiv
status_color: green
location_city: Wien
start_date: '2026-08-15'
end_date: '2026-09-04'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
total_vacancies: 1
filled_vacancies: 0
hourly_rate_gross: 25
applications_count: 6
shifts_count: 1
has_compliance_warning: false
is_deleted: false
created_at: '2026-08-05T16:18:29+00:00'
-
id: 019fd2b8-1dad-7375-b680-f51dcff486d0
title: 'Verpackungshelfer*in'
organization:
id: 019fd2b8-00e8-7186-8fa6-5b042a30b10d
name: 'Transport & Spedition GmbH'
status: active
category: production
category_label: Produktion
status: filled
status_label: Besetzt
status_color: purple
location_city: Wien
start_date: '2026-07-29'
end_date: '2026-08-03'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
total_vacancies: 8
filled_vacancies: 8
hourly_rate_gross: 14.5
applications_count: 4
shifts_count: 1
has_compliance_warning: false
is_deleted: false
created_at: '2026-08-05T16:18:29+00:00'
-
id: 019fd2b8-1d03-71ce-9e17-21e92ae7b9d7
title: 'Netzwerktechniker Hotline'
organization:
id: 019fd2b7-fbb4-73fa-b801-e0c8a8de2651
name: 'Bauwerk GmbH'
status: active
category: software
category_label: Software
status: filled
status_label: Besetzt
status_color: purple
location_city: Wien
start_date: '2026-07-31'
end_date: '2026-08-03'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
total_vacancies: 3
filled_vacancies: 3
hourly_rate_gross: 21
applications_count: 3
shifts_count: 1
has_compliance_warning: false
is_deleted: false
created_at: '2026-08-05T16:18:29+00:00'
pagination:
type: object
properties:
current_page:
type: integer
examples:
- 1
last_page:
type: integer
examples:
- 6
per_page:
type: integer
examples:
- 25
total:
type: integer
examples:
- 133
examples:
-
status: SUCCESS
data:
jobs:
-
id: 019fd2b8-28e8-73a4-94d6-5a423c21f064
title: 'Foundry Mold and Coremaker'
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
status: active
category: software
category_label: Software
status: draft
status_label: Entwurf
status_color: gray
location_city: 'South Zachery'
start_date: '2026-08-29'
end_date: '2026-09-25'
shift_start_time: '16:30:00'
shift_end_time: '14:33:00'
total_vacancies: 10
filled_vacancies: 0
hourly_rate_gross: 29.86
applications_count: 0
shifts_count: 0
has_compliance_warning: false
is_deleted: false
created_at: '2026-08-05T16:18:32+00:00'
-
id: 019fd2b8-28c4-732f-a94c-fb5a71a7d682
title: Accountant
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
status: active
category: office
category_label: Büro
status: active
status_label: Aktiv
status_color: green
location_city: 'East Eliseo'
start_date: '2026-08-12'
end_date: '2026-08-19'
shift_start_time: '01:49:00'
shift_end_time: '18:57:00'
total_vacancies: 5
filled_vacancies: 0
hourly_rate_gross: 32.08
applications_count: 1
shifts_count: 4
has_compliance_warning: false
is_deleted: false
created_at: '2026-08-05T16:18:32+00:00'
-
id: 019fd2b8-28ee-71e0-b50d-2c303c17f728
title: 'Kindergarten Teacher'
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
status: active
category: warehouse
category_label: Lager
status: pending_review
status_label: 'In Prüfung'
status_color: yellow
location_city: Eldahaven
start_date: '2026-08-21'
end_date: '2026-09-15'
shift_start_time: '06:44:00'
shift_end_time: '06:04:00'
total_vacancies: 1
filled_vacancies: 0
hourly_rate_gross: 18.4
applications_count: 0
shifts_count: 0
has_compliance_warning: false
is_deleted: false
created_at: '2026-08-05T16:18:32+00:00'
-
id: 019fd2b8-2705-73fd-a401-002956f1f401
title: 'Fahrer*in Zustelldienst Wien Nord'
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
status: active
category: logistics
category_label: Logistik
status: published
status_label: Aktiv
status_color: green
location_city: Wien
start_date: '2026-08-14'
end_date: '2026-08-15'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
total_vacancies: 4
filled_vacancies: 0
hourly_rate_gross: 15
applications_count: 0
shifts_count: 0
has_compliance_warning: false
is_deleted: false
created_at: '2026-08-05T16:18:31+00:00'
-
id: 019fd2b8-2599-7355-a7f1-dcb185b05faa
title: 'Rezeptionist*in Hotel Sacher'
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
status: active
category: hotel
category_label: Hotellerie
status: published
status_label: Aktiv
status_color: green
location_city: Wien
start_date: '2026-08-17'
end_date: '2026-08-19'
shift_start_time: '09:00:00'
shift_end_time: '17:00:00'
total_vacancies: 4
filled_vacancies: 0
hourly_rate_gross: 17.5
applications_count: 51
shifts_count: 0
has_compliance_warning: false
is_deleted: false
created_at: '2026-08-05T16:18:31+00:00'
-
id: 019fd2b8-24b0-700a-ae2a-142f5e48aead
title: 'Lagerhelfer*in Logistikzentrum Inzersdorf'
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
status: active
category: warehouse
category_label: Lager
status: published
status_label: Aktiv
status_color: green
location_city: Wien
start_date: '2026-08-12'
end_date: '2026-08-14'
shift_start_time: '22:00:00'
shift_end_time: '06:00:00'
total_vacancies: 15
filled_vacancies: 0
hourly_rate_gross: 14.8
applications_count: 29
shifts_count: 0
has_compliance_warning: false
is_deleted: false
created_at: '2026-08-05T16:18:31+00:00'
-
id: 019fd2b8-270a-71f9-a13c-ef188105041c
title: 'Reinigungskraft Hotel Ibis Mariahilf'
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
status: active
category: cleaning
category_label: Reinigung
status: published
status_label: Aktiv
status_color: green
location_city: Wien
start_date: '2026-08-16'
end_date: '2026-08-17'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
total_vacancies: 3
filled_vacancies: 0
hourly_rate_gross: 13.2
applications_count: 0
shifts_count: 0
has_compliance_warning: false
is_deleted: false
created_at: '2026-08-05T16:18:31+00:00'
-
id: 019fd2b8-26fb-7142-b3a3-df10c3591584
title: 'Küchenhilfe Streetfood Festival Naschmarkt'
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
status: active
category: catering
category_label: Catering
status: published
status_label: Aktiv
status_color: green
location_city: Wien
start_date: '2026-08-13'
end_date: '2026-08-14'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
total_vacancies: 6
filled_vacancies: 0
hourly_rate_gross: 13
applications_count: 0
shifts_count: 0
has_compliance_warning: false
is_deleted: false
created_at: '2026-08-05T16:18:31+00:00'
-
id: 019fd2b8-270f-715d-a3a0-76c4c314e3ff
title: 'Verkäufer*in Elektronik Mediamarkt Vösendorf'
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
status: active
category: retail
category_label: Einzelhandel
status: published
status_label: Aktiv
status_color: green
location_city: Vösendorf
start_date: '2026-08-20'
end_date: '2026-08-21'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
total_vacancies: 7
filled_vacancies: 0
hourly_rate_gross: 14
applications_count: 0
shifts_count: 0
has_compliance_warning: false
is_deleted: false
created_at: '2026-08-05T16:18:31+00:00'
-
id: 019fd2b8-2700-724b-adc5-2be8957e0590
title: 'Kassierer*in Supermarkt Floridsdorf'
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
status: active
category: supermarket
category_label: Lebensmittelhandel
status: published
status_label: Aktiv
status_color: green
location_city: Wien
start_date: '2026-08-11'
end_date: '2026-08-12'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
total_vacancies: 5
filled_vacancies: 0
hourly_rate_gross: 13.5
applications_count: 0
shifts_count: 0
has_compliance_warning: false
is_deleted: false
created_at: '2026-08-05T16:18:31+00:00'
-
id: 019fd2b8-21c8-72cc-80b1-47fd13450522
title: 'Barkeeper*in Sommernacht Open Air'
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
status: active
category: gastro
category_label: Gastronomie
status: published
status_label: Aktiv
status_color: green
location_city: Wien
start_date: '2026-08-15'
end_date: '2026-08-17'
shift_start_time: '22:00:00'
shift_end_time: '06:00:00'
total_vacancies: 8
filled_vacancies: 0
hourly_rate_gross: 16
applications_count: 38
shifts_count: 0
has_compliance_warning: false
is_deleted: false
created_at: '2026-08-05T16:18:30+00:00'
-
id: 019fd2b8-22cf-71c5-8edd-5e3ce9d29e8b
title: 'Promoter*in Vienna Marathon'
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
status: active
category: event
category_label: Events
status: published
status_label: Aktiv
status_color: green
location_city: Wien
start_date: '2026-08-26'
end_date: '2026-08-28'
shift_start_time: '09:00:00'
shift_end_time: '17:00:00'
total_vacancies: 20
filled_vacancies: 0
hourly_rate_gross: 13.5
applications_count: 62
shifts_count: 0
has_compliance_warning: false
is_deleted: false
created_at: '2026-08-05T16:18:30+00:00'
-
id: 019fd2b8-1f86-7376-9a3a-c072ab5675cb
title: 'Service-Mitarbeiter*in Wiener Prater Festival'
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
status: active
category: gastro
category_label: Gastronomie
status: published
status_label: Aktiv
status_color: green
location_city: Wien
start_date: '2026-08-19'
end_date: '2026-08-21'
shift_start_time: '09:00:00'
shift_end_time: '17:00:00'
total_vacancies: 12
filled_vacancies: 0
hourly_rate_gross: 15.5
applications_count: 45
shifts_count: 0
has_compliance_warning: false
is_deleted: false
created_at: '2026-08-05T16:18:29+00:00'
-
id: 019fd2b8-1dcd-734a-a041-f809f58e95fb
title: 'IT Supportkraft Vertretung'
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
status: active
category: it_services
category_label: 'IT Services'
status: pending_review
status_label: 'In Prüfung'
status_color: yellow
location_city: Wien
start_date: '2026-08-20'
end_date: '2026-09-04'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
total_vacancies: 2
filled_vacancies: 0
hourly_rate_gross: 22
applications_count: 0
shifts_count: 0
has_compliance_warning: false
is_deleted: false
created_at: '2026-08-05T16:18:29+00:00'
-
id: 019fd2b8-1dc8-7078-bcc2-07c7297ffa47
title: 'Nachtschicht Lager Q4'
organization:
id: 019fd2b7-f91f-70cb-8409-8632db9df3c7
name: 'Sicherheitsdienst Österreich'
status: active
category: logistics
category_label: Logistik
status: draft
status_label: Entwurf
status_color: gray
location_city: Graz
start_date: '2026-12-03'
end_date: '2027-02-01'
shift_start_time: '22:00:00'
shift_end_time: '06:00:00'
total_vacancies: 20
filled_vacancies: 0
hourly_rate_gross: 15.5
applications_count: 0
shifts_count: 0
has_compliance_warning: false
is_deleted: false
created_at: '2026-08-05T16:18:29+00:00'
-
id: 019fd2b8-1d92-7277-aa77-7172270002a5
title: 'Qualitätskontrolle Lebensmittel'
organization:
id: 019fd2b7-f4d3-71a1-89d4-ca7d5731b32a
name: 'Wiener Gastro GmbH'
status: active
category: production
category_label: Produktion
status: active
status_label: Aktiv
status_color: green
location_city: Graz
start_date: '2026-08-08'
end_date: '2026-10-04'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
total_vacancies: 4
filled_vacancies: 0
hourly_rate_gross: 15.5
applications_count: 8
shifts_count: 2
has_compliance_warning: false
is_deleted: false
created_at: '2026-08-05T16:18:29+00:00'
-
id: 019fd2b8-1dc6-72cc-acac-502231efcb6b
title: 'Messehostess Herbstmesse'
organization:
id: 019fd2b7-f91f-70cb-8409-8632db9df3c7
name: 'Sicherheitsdienst Österreich'
status: active
category: event
category_label: Events
status: draft
status_label: Entwurf
status_color: gray
location_city: Wien
start_date: '2026-11-03'
end_date: '2026-11-08'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
total_vacancies: 10
filled_vacancies: 0
hourly_rate_gross: 14
applications_count: 0
shifts_count: 0
has_compliance_warning: false
is_deleted: false
created_at: '2026-08-05T16:18:29+00:00'
-
id: 019fd2b8-1dcb-73f4-9257-e7fa42fe8514
title: 'Sommerfest Catering'
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
status: active
category: catering
category_label: Catering
status: pending_review
status_label: 'In Prüfung'
status_color: yellow
location_city: Wien
start_date: '2026-09-24'
end_date: '2026-09-25'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
total_vacancies: 12
filled_vacancies: 0
hourly_rate_gross: 15
applications_count: 0
shifts_count: 0
has_compliance_warning: false
is_deleted: false
created_at: '2026-08-05T16:18:29+00:00'
-
id: 019fd2b8-1d1e-7188-9438-b0d6050c492a
title: 'Kursleiter*in Deutschkurs'
organization:
id: 019fd2b8-00e8-7186-8fa6-5b042a30b10d
name: 'Transport & Spedition GmbH'
status: active
category: education
category_label: Bildung
status: active
status_label: Aktiv
status_color: green
location_city: Wien
start_date: '2026-08-12'
end_date: '2026-11-03'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
total_vacancies: 3
filled_vacancies: 0
hourly_rate_gross: 18
applications_count: 6
shifts_count: 2
has_compliance_warning: false
is_deleted: false
created_at: '2026-08-05T16:18:29+00:00'
-
id: 019fd2b8-1d4e-71d9-aad9-3d9f47a96e48
title: 'Ausstellungsführer Museum'
organization:
id: 019fd2b7-fbb4-73fa-b801-e0c8a8de2651
name: 'Bauwerk GmbH'
status: active
category: education
category_label: Bildung
status: active
status_label: Aktiv
status_color: green
location_city: Wien
start_date: '2026-08-15'
end_date: '2027-02-01'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
total_vacancies: 4
filled_vacancies: 0
hourly_rate_gross: 15
applications_count: 7
shifts_count: 1
has_compliance_warning: false
is_deleted: false
created_at: '2026-08-05T16:18:29+00:00'
-
id: 019fd2b8-1ce9-736a-9a61-22cea78283c9
title: 'Support-Techniker Außeneinsatz'
organization:
id: 019fd2b7-f91f-70cb-8409-8632db9df3c7
name: 'Sicherheitsdienst Österreich'
status: active
category: it_services
category_label: 'IT Services'
status: active
status_label: Aktiv
status_color: green
location_city: Graz
start_date: '2026-08-12'
end_date: '2026-10-04'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
total_vacancies: 2
filled_vacancies: 0
hourly_rate_gross: 20
applications_count: 4
shifts_count: 2
has_compliance_warning: false
is_deleted: false
created_at: '2026-08-05T16:18:29+00:00'
-
id: 019fd2b8-1d3f-7297-8384-35d386f1454b
title: 'Schulassistenz Volksschule'
organization:
id: 019fd2b7-f5ae-7390-a778-c08c8d56cdc0
name: 'Event Solutions Austria'
status: active
category: education
category_label: Bildung
status: active
status_label: Aktiv
status_color: green
location_city: Wien
start_date: '2026-08-08'
end_date: '2026-11-03'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
total_vacancies: 2
filled_vacancies: 0
hourly_rate_gross: 15.5
applications_count: 3
shifts_count: 1
has_compliance_warning: false
is_deleted: false
created_at: '2026-08-05T16:18:29+00:00'
-
id: 019fd2b8-1ccb-7322-8d33-448afd9b027b
title: 'Testingenieur Vertretung'
organization:
id: 019fd2b7-f842-71ba-a318-a919a24d4bcf
name: 'Hotel & Spa Imperial'
status: active
category: it_services
category_label: 'IT Services'
status: active
status_label: Aktiv
status_color: green
location_city: Wien
start_date: '2026-08-15'
end_date: '2026-09-04'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
total_vacancies: 1
filled_vacancies: 0
hourly_rate_gross: 25
applications_count: 6
shifts_count: 1
has_compliance_warning: false
is_deleted: false
created_at: '2026-08-05T16:18:29+00:00'
-
id: 019fd2b8-1dad-7375-b680-f51dcff486d0
title: 'Verpackungshelfer*in'
organization:
id: 019fd2b8-00e8-7186-8fa6-5b042a30b10d
name: 'Transport & Spedition GmbH'
status: active
category: production
category_label: Produktion
status: filled
status_label: Besetzt
status_color: purple
location_city: Wien
start_date: '2026-07-29'
end_date: '2026-08-03'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
total_vacancies: 8
filled_vacancies: 8
hourly_rate_gross: 14.5
applications_count: 4
shifts_count: 1
has_compliance_warning: false
is_deleted: false
created_at: '2026-08-05T16:18:29+00:00'
-
id: 019fd2b8-1d03-71ce-9e17-21e92ae7b9d7
title: 'Netzwerktechniker Hotline'
organization:
id: 019fd2b7-fbb4-73fa-b801-e0c8a8de2651
name: 'Bauwerk GmbH'
status: active
category: software
category_label: Software
status: filled
status_label: Besetzt
status_color: purple
location_city: Wien
start_date: '2026-07-31'
end_date: '2026-08-03'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
total_vacancies: 3
filled_vacancies: 3
hourly_rate_gross: 21
applications_count: 3
shifts_count: 1
has_compliance_warning: false
is_deleted: false
created_at: '2026-08-05T16:18:29+00:00'
pagination:
current_page: 1
last_page: 6
per_page: 25
total: 133
tags:
- 'Admin API'
'/api/v1/admin/jobs/{job}':
get:
summary: 'Show Job'
operationId: showJob
description: 'Show detailed job information for admin review.'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
job:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-28c4-732f-a94c-fb5a71a7d682
title:
type: string
examples:
- Accountant
description:
type: string
examples:
- 'Ut nostrum rerum ut alias quia libero excepturi. Voluptatum et aut non quia quisquam molestias. Perferendis qui hic unde.'
category:
type: string
examples:
- office
category_label:
type: string
examples:
- Büro
status:
type: string
examples:
- active
status_label:
type: string
examples:
- Aktiv
status_color:
type: string
examples:
- green
shift_type:
type: string
examples:
- night
shift_type_label:
type: string
examples:
- Nachtschicht
organization:
type: object
properties:
id:
type: string
examples:
- 019fd2b7-f072-7154-8961-5b324cc6c46c
name:
type: string
examples:
- Caritas
status:
type: string
examples:
- active
email:
type: string
examples:
- caritas-portal@flexxr.eu.cc
location:
type: object
properties:
name:
type: string
examples:
- 'Barrows, Christiansen and Jones'
address:
type: string
examples:
- '586 Tremaine Row'
city:
type: string
examples:
- 'East Eliseo'
postal_code:
type: string
examples:
- 10547-3697
lat:
type: number
examples:
- 46.931383
lng:
type: number
examples:
- 11.998284
schedule:
type: object
properties:
start_date:
type: string
examples:
- '2026-08-12'
end_date:
type: string
examples:
- '2026-08-19'
shift_start_time:
type: string
examples:
- '01:49:00'
shift_end_time:
type: string
examples:
- '18:57:00'
application_deadline:
type: string
examples:
- '2026-09-05'
confirmation_deadline:
type: string
examples:
- '2026-08-16'
sign_window_hours:
type: integer
examples:
- 24
vacancies:
type: object
properties:
total:
type: integer
examples:
- 5
filled:
type: integer
examples:
- 0
available:
type: integer
examples:
- 5
compensation:
type: object
properties:
hourly_rate_gross:
type: number
examples:
- 32.08
supplements:
type: object
properties:
night:
type: number
examples:
- 0.7
weekend:
type: number
examples:
- 3.86
estimated_total_gross:
type:
- string
- 'null'
examples:
- null
requirements:
type: object
properties:
qualifications:
type: array
examples:
- []
dress_code:
type: string
examples:
- 'Tempore necessitatibus quia illo suscipit.'
equipment_provided:
type: string
examples:
- 'Adipisci fugiat doloremque atque consectetur necessitatibus sunt cumque.'
job_requirements:
type: array
items:
type: object
properties:
type:
type: string
examples: [document]
code:
type: string
examples: [passport]
name:
type: string
examples: [Reisepass]
is_mandatory:
type: boolean
examples: [true]
examples:
-
-
type: document
code: passport
name: Reisepass
is_mandatory: true
-
type: document
code: driver_license
name: Führerschein
is_mandatory: true
contact:
type: object
properties:
parking_info:
type:
- string
- 'null'
examples:
- null
special_instructions:
type:
- string
- 'null'
examples:
- null
review:
type: object
properties:
submitted_at:
type:
- string
- 'null'
examples:
- null
reviewed_at:
type:
- string
- 'null'
examples:
- null
rejection_note:
type:
- string
- 'null'
examples:
- null
submit_count:
type: integer
examples:
- 0
compliance:
type: object
properties:
has_warning:
type: boolean
examples:
- false
warnings:
type: array
examples:
- []
timestamps:
type: object
properties:
published_at:
type:
- string
- 'null'
examples:
- null
filled_at:
type:
- string
- 'null'
examples:
- null
cancelled_at:
type:
- string
- 'null'
examples:
- null
deleted_at:
type:
- string
- 'null'
examples:
- null
created_at:
type: string
examples:
- '2026-08-05T16:18:32+00:00'
updated_at:
type: string
examples:
- '2026-08-05T16:18:32+00:00'
cancellation_reason:
type:
- string
- 'null'
examples:
- null
is_deleted:
type: boolean
examples:
- false
stats:
type: object
properties:
applications_count:
type: integer
examples:
- 1
shifts_count:
type: integer
examples:
- 4
applications:
type: array
items:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-28c6-73d1-b719-dae19c4d443c
user:
type: object
properties:
id:
type: string
examples: [019fd2b7-f271-73fd-8268-848be381e136]
name:
type: string
examples: ['Anna Neuling']
email:
type: string
examples: [pending@demo.flexxr.at]
status:
type: string
examples:
- selected
applied_at:
type: string
examples:
- '2026-08-05T16:18:32+00:00'
examples:
-
-
id: 019fd2b8-28c6-73d1-b719-dae19c4d443c
user:
id: 019fd2b7-f271-73fd-8268-848be381e136
name: 'Anna Neuling'
email: pending@demo.flexxr.at
status: selected
applied_at: '2026-08-05T16:18:32+00:00'
shifts:
type: array
items:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-28df-7265-8b1e-cb5de026e4d7
user_id:
type: string
examples:
- 019fd2b7-f271-73fd-8268-848be381e136
status:
type: string
examples:
- completed
date:
type: string
examples:
- '2026-08-03'
clock_in_at:
type:
- string
- 'null'
examples:
- null
clock_out_at:
type:
- string
- 'null'
examples:
- null
examples:
-
-
id: 019fd2b8-28df-7265-8b1e-cb5de026e4d7
user_id: 019fd2b7-f271-73fd-8268-848be381e136
status: completed
date: '2026-08-03'
clock_in_at: null
clock_out_at: null
-
id: 019fd2b8-28d1-7112-b8e9-68bd79fbafb9
user_id: 019fd2b7-f271-73fd-8268-848be381e136
status: awaiting_signature
date: '2026-08-04'
clock_in_at: null
clock_out_at: null
-
id: 019fd2b8-28d8-728d-a447-8de1a42eec83
user_id: 019fd2b7-f271-73fd-8268-848be381e136
status: checked_in
date: '2026-08-05'
clock_in_at: null
clock_out_at: null
-
id: 019fd2b8-28d3-70d7-92eb-f1bb1577acaf
user_id: 019fd2b7-f271-73fd-8268-848be381e136
status: signed
date: '2026-08-06'
clock_in_at: null
clock_out_at: null
planned_shifts:
type: array
items:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-28d5-7103-b951-9f6ff1d94556
shift_date:
type: string
examples:
- '2026-08-05'
start_time:
type: string
examples:
- '08:00'
end_time:
type: string
examples:
- '16:00'
break_minutes:
type: integer
examples:
- 30
workers_needed:
type: integer
examples:
- 2
shift_manager_name:
type:
- string
- 'null'
examples:
- null
notes:
type:
- string
- 'null'
examples:
- null
dress_code:
type:
- string
- 'null'
examples:
- null
contact_person_name:
type:
- string
- 'null'
examples:
- null
contact_person_phone:
type:
- string
- 'null'
examples:
- null
meeting_point:
type:
- string
- 'null'
examples:
- null
geofence:
type:
- string
- 'null'
examples:
- null
application_deadline:
type:
- string
- 'null'
examples:
- null
examples:
-
-
id: 019fd2b8-28d5-7103-b951-9f6ff1d94556
shift_date: '2026-08-05'
start_time: '08:00'
end_time: '16:00'
break_minutes: 30
workers_needed: 2
shift_manager_name: null
notes: null
dress_code: null
contact_person_name: null
contact_person_phone: null
meeting_point: null
geofence: null
application_deadline: null
examples:
-
status: SUCCESS
data:
job:
id: 019fd2b8-28c4-732f-a94c-fb5a71a7d682
title: Accountant
description: 'Ut nostrum rerum ut alias quia libero excepturi. Voluptatum et aut non quia quisquam molestias. Perferendis qui hic unde.'
category: office
category_label: Büro
status: active
status_label: Aktiv
status_color: green
shift_type: night
shift_type_label: Nachtschicht
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
status: active
email: caritas-portal@flexxr.eu.cc
location:
name: 'Barrows, Christiansen and Jones'
address: '586 Tremaine Row'
city: 'East Eliseo'
postal_code: 10547-3697
lat: 46.931383
lng: 11.998284
schedule:
start_date: '2026-08-12'
end_date: '2026-08-19'
shift_start_time: '01:49:00'
shift_end_time: '18:57:00'
application_deadline: '2026-09-05'
confirmation_deadline: '2026-08-16'
sign_window_hours: 24
vacancies:
total: 5
filled: 0
available: 5
compensation:
hourly_rate_gross: 32.08
supplements:
night: 0.7
weekend: 3.86
estimated_total_gross: null
requirements:
qualifications: []
dress_code: 'Tempore necessitatibus quia illo suscipit.'
equipment_provided: 'Adipisci fugiat doloremque atque consectetur necessitatibus sunt cumque.'
job_requirements:
-
type: document
code: passport
name: Reisepass
is_mandatory: true
-
type: document
code: driver_license
name: Führerschein
is_mandatory: true
contact:
parking_info: null
special_instructions: null
review:
submitted_at: null
reviewed_at: null
rejection_note: null
submit_count: 0
compliance:
has_warning: false
warnings: []
timestamps:
published_at: null
filled_at: null
cancelled_at: null
deleted_at: null
created_at: '2026-08-05T16:18:32+00:00'
updated_at: '2026-08-05T16:18:32+00:00'
cancellation_reason: null
is_deleted: false
stats:
applications_count: 1
shifts_count: 4
applications:
-
id: 019fd2b8-28c6-73d1-b719-dae19c4d443c
user:
id: 019fd2b7-f271-73fd-8268-848be381e136
name: 'Anna Neuling'
email: pending@demo.flexxr.at
status: selected
applied_at: '2026-08-05T16:18:32+00:00'
shifts:
-
id: 019fd2b8-28df-7265-8b1e-cb5de026e4d7
user_id: 019fd2b7-f271-73fd-8268-848be381e136
status: completed
date: '2026-08-03'
clock_in_at: null
clock_out_at: null
-
id: 019fd2b8-28d1-7112-b8e9-68bd79fbafb9
user_id: 019fd2b7-f271-73fd-8268-848be381e136
status: awaiting_signature
date: '2026-08-04'
clock_in_at: null
clock_out_at: null
-
id: 019fd2b8-28d8-728d-a447-8de1a42eec83
user_id: 019fd2b7-f271-73fd-8268-848be381e136
status: checked_in
date: '2026-08-05'
clock_in_at: null
clock_out_at: null
-
id: 019fd2b8-28d3-70d7-92eb-f1bb1577acaf
user_id: 019fd2b7-f271-73fd-8268-848be381e136
status: signed
date: '2026-08-06'
clock_in_at: null
clock_out_at: null
planned_shifts:
-
id: 019fd2b8-28d5-7103-b951-9f6ff1d94556
shift_date: '2026-08-05'
start_time: '08:00'
end_time: '16:00'
break_minutes: 30
workers_needed: 2
shift_manager_name: null
notes: null
dress_code: null
contact_person_name: null
contact_person_phone: null
meeting_point: null
geofence: null
application_deadline: null
tags:
- 'Admin API'
parameters:
-
in: path
name: job
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
'/api/v1/admin/jobs/{job}/approve':
post:
summary: 'Approve Job'
operationId: approveJob
description: 'POST /admin/jobs/{job}/approve'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'The job has been approved and published.'
data:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-6bb5-7113-b62c-7434d5f44733
status:
type: string
examples:
- active
status_label:
type: string
examples:
- Aktiv
published_at:
type: string
examples:
- '2026-08-05 16:18'
examples:
-
status: SUCCESS
message: 'The job has been approved and published.'
data:
id: 019fd2b8-6bb5-7113-b62c-7434d5f44733
status: active
status_label: Aktiv
published_at: '2026-08-05 16:18'
tags:
- 'Admin API'
parameters:
-
in: path
name: job
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
'/api/v1/admin/jobs/{job}/reject':
post:
summary: 'Reject Job'
operationId: rejectJob
description: 'POST /admin/jobs/{job}/reject'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'The job has been rejected. The company can edit and resubmit it.'
data:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-70e9-7002-b15b-8db7f766386d
status:
type: string
examples:
- rejected
status_label:
type: string
examples:
- Abgelehnt
rejection_note:
type: string
examples:
- 'Der Stundensatz liegt unter dem Kollektivvertrag.'
examples:
-
status: SUCCESS
message: 'The job has been rejected. The company can edit and resubmit it.'
data:
id: 019fd2b8-70e9-7002-b15b-8db7f766386d
status: rejected
status_label: Abgelehnt
rejection_note: 'Der Stundensatz liegt unter dem Kollektivvertrag.'
tags:
- 'Admin API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
note:
type: string
description: ''
examples:
- Beispieltext
required:
- note
parameters:
-
in: path
name: job
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
'/api/v1/admin/jobs/{job}/force-close':
post:
summary: 'Force Close Job'
operationId: forceCloseJob
description: 'Emergency close a job listing by admin.'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- messages.job_force_closed
data:
type: object
properties:
job_id:
type: string
examples:
- 019fd2b8-28c4-732f-a94c-fb5a71a7d682
affected_shifts_count:
type: integer
examples:
- 2
affected_shifts:
type: array
items:
type: object
properties:
shift_id:
type: string
examples:
- 019fd2b8-28d1-7112-b8e9-68bd79fbafb9
user_id:
type: string
examples:
- 019fd2b7-f271-73fd-8268-848be381e136
user_email:
type: string
examples:
- pending@demo.flexxr.at
examples:
-
-
shift_id: 019fd2b8-28d1-7112-b8e9-68bd79fbafb9
user_id: 019fd2b7-f271-73fd-8268-848be381e136
user_email: pending@demo.flexxr.at
-
shift_id: 019fd2b8-28d3-70d7-92eb-f1bb1577acaf
user_id: 019fd2b7-f271-73fd-8268-848be381e136
user_email: pending@demo.flexxr.at
examples:
-
status: SUCCESS
message: messages.job_force_closed
data:
job_id: 019fd2b8-28c4-732f-a94c-fb5a71a7d682
affected_shifts_count: 2
affected_shifts:
-
shift_id: 019fd2b8-28d1-7112-b8e9-68bd79fbafb9
user_id: 019fd2b7-f271-73fd-8268-848be381e136
user_email: pending@demo.flexxr.at
-
shift_id: 019fd2b8-28d3-70d7-92eb-f1bb1577acaf
user_id: 019fd2b7-f271-73fd-8268-848be381e136
user_email: pending@demo.flexxr.at
tags:
- 'Admin API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
reason:
type: string
description: ''
examples:
- 'Krankheitsbedingt kurzfristig abgesagt.'
notify_employees:
type: boolean
description: ''
examples:
- true
notify_organization:
type: boolean
description: ''
examples:
- true
required:
- reason
parameters:
-
in: path
name: job
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
'/api/v1/admin/jobs/{job_id}/featured':
put:
summary: 'Toggle Job Featured'
operationId: toggleJobFeatured
description: "Sets or flips whether a job is featured on the home screen. Pass\n`is_featured` to set an explicit value, or omit it to flip the\ncurrent value."
parameters: []
responses: { }
tags:
- 'Admin API'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
is_featured:
type: boolean
description: ''
examples:
- true
parameters:
-
in: path
name: job_id
description: 'The ID of the job.'
required: true
schema:
type: string
examples:
- 019f1584-1555-72af-96c3-88f3f979d25c
-
in: path
name: job
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
/api/v1/admin/settings:
get:
summary: 'List Settings'
operationId: listSettings
description: 'Returns all application settings, optionally filtered by group.'
parameters:
-
in: query
name: group
description: 'Filter by group.'
required: false
schema:
type: string
description: 'Filter by group.'
examples:
- general
-
in: query
name: per_page
description: 'Number of items per page.'
required: false
schema:
type: integer
description: 'Number of items per page.'
examples:
- 15
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- Success
data:
type: array
examples:
- []
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 4e6a4f9a-ecc4-4ca9-b4ea-292f901c07e7
timestamp:
type: string
examples:
- '2026-08-05T16:18:42.512221Z'
current_page:
type: integer
examples:
- 1
last_page:
type: integer
examples:
- 1
per_page:
type: integer
examples:
- 15
total:
type: integer
examples:
- 0
examples:
-
status: SUCCESS
message: Success
data: []
errors: null
meta:
request_id: 4e6a4f9a-ecc4-4ca9-b4ea-292f901c07e7
timestamp: '2026-08-05T16:18:42.512221Z'
current_page: 1
last_page: 1
per_page: 15
total: 0
tags:
- 'Admin API'
put:
summary: 'Bulk-update application settings in a single transactional request.'
operationId: bulkUpdateApplicationSettingsInASingleTransactionalRequest
description: "Used by the admin Settings page to save a whole tab (e.g. \"Stripe\", \"Mail\")\nat once. Per-row payloads are individually validated against each setting's\n`validation` rules, and the entire batch is rolled back if any row fails\nauthorisation or validation."
parameters: []
responses: { }
tags:
- 'Admin API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
settings:
type: array
description: ''
items:
type: string
examples:
- null
required:
- settings
/api/v1/admin/settings/bulk:
post:
summary: 'Bulk-update application settings in a single transactional request.'
operationId: bulkUpdateApplicationSettingsInASingleTransactionalRequest
description: "Used by the admin Settings page to save a whole tab (e.g. \"Stripe\", \"Mail\")\nat once. Per-row payloads are individually validated against each setting's\n`validation` rules, and the entire batch is rolled back if any row fails\nauthorisation or validation."
parameters: []
responses: { }
tags:
- 'Admin API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
settings:
type: array
description: ''
items:
type: string
examples:
- null
required:
- settings
'/api/v1/admin/settings/{setting_key}/reveal':
post:
summary: 'Reveal the cleartext value of a secret setting.'
operationId: revealTheCleartextValueOfASecretSetting
description: "Super-admin only; every reveal is audit-logged with admin id, ip,\nuser-agent, and timestamp. Clients should treat the returned value\nas one-shot — re-displaying it requires another reveal call."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Setting value revealed.'
data:
type: object
properties:
key:
type: string
examples:
- app.name
value:
type: string
examples:
- 'Flexxer Backend'
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- df0d0749-d201-42cf-aa40-f250f25d2b49
timestamp:
type: string
examples:
- '2026-08-05T16:18:42.552956Z'
examples:
-
status: SUCCESS
message: 'Setting value revealed.'
data:
key: app.name
value: 'Flexxer Backend'
errors: null
meta:
request_id: df0d0749-d201-42cf-aa40-f250f25d2b49
timestamp: '2026-08-05T16:18:42.552956Z'
tags:
- 'Admin API'
get:
summary: 'Reveal the cleartext value of a secret setting.'
operationId: revealTheCleartextValueOfASecretSetting
description: "Super-admin only; every reveal is audit-logged with admin id, ip,\nuser-agent, and timestamp. Clients should treat the returned value\nas one-shot — re-displaying it requires another reveal call."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Setting value revealed.'
data:
type: object
properties:
key:
type: string
examples:
- app.name
value:
type: string
examples:
- 'Flexxer Backend'
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- df0d0749-d201-42cf-aa40-f250f25d2b49
timestamp:
type: string
examples:
- '2026-08-05T16:18:42.552956Z'
examples:
-
status: SUCCESS
message: 'Setting value revealed.'
data:
key: app.name
value: 'Flexxer Backend'
errors: null
meta:
request_id: df0d0749-d201-42cf-aa40-f250f25d2b49
timestamp: '2026-08-05T16:18:42.552956Z'
tags:
- 'Admin API'
parameters:
-
in: path
name: setting_key
description: ''
required: true
schema:
type: string
examples:
- app.name
'/api/v1/admin/settings/{setting_key}':
get:
summary: 'Returns a single application setting identified by its key via'
operationId: returnsASingleApplicationSettingIdentifiedByItsKeyVia
description: 'route-model binding ({setting:key}). * @group Admin API'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Setting retrieved successfully.'
data:
type: object
properties:
id:
type: string
examples:
- 019fd2b7-eea2-7183-91ff-569d302b80a5
key:
type: string
examples:
- app.name
value:
type: string
examples:
- 'Flexxer Backend'
has_value:
type: boolean
examples:
- true
type:
type: string
examples:
- string
group:
type: string
examples:
- application
label:
type: string
examples:
- 'Application name'
description:
type:
- string
- 'null'
examples:
- null
is_secret:
type: boolean
examples:
- false
is_encrypted:
type: boolean
examples:
- false
is_public:
type: boolean
examples:
- true
config_path:
type: string
examples:
- app.name
validation:
type: array
items:
type: string
examples:
-
- 'max:100'
sort_order:
type: integer
examples:
- 10
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 6bc74203-0d37-4005-acc7-4ca85f5ae75b
timestamp:
type: string
examples:
- '2026-08-05T16:18:42.572305Z'
examples:
-
status: SUCCESS
message: 'Setting retrieved successfully.'
data:
id: 019fd2b7-eea2-7183-91ff-569d302b80a5
key: app.name
value: 'Flexxer Backend'
has_value: true
type: string
group: application
label: 'Application name'
description: null
is_secret: false
is_encrypted: false
is_public: true
config_path: app.name
validation:
- 'max:100'
sort_order: 10
errors: null
meta:
request_id: 6bc74203-0d37-4005-acc7-4ca85f5ae75b
timestamp: '2026-08-05T16:18:42.572305Z'
tags:
- 'Admin API'
put:
summary: "Update a single application setting identified by its key via\nroute-model binding ({setting:key})."
operationId: updateASingleApplicationSettingIdentifiedByItsKeyViaRouteModelBindingsettingkey
description: "- Authorisation is enforced through AppSettingPolicy::update so secret\n / privileged-group keys (stripe, mail, oauth, ...) require super_admin.\n- Validation rules are derived dynamically from the setting's own\n `validation` JSON column plus its declared `type`.\n- Encryption (when is_encrypted=true) is handled transparently by\n AppSetting::writeValue().\n- The settings cache is invalidated through SettingsService::set so the\n next request observes the new value."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Setting updated successfully.'
data:
type: object
properties:
id:
type: string
examples:
- 019fd2b7-eea2-7183-91ff-569d302b80a5
key:
type: string
examples:
- app.name
value:
type: string
examples:
- Beispieltext
has_value:
type: boolean
examples:
- true
type:
type: string
examples:
- string
group:
type: string
examples:
- application
label:
type: string
examples:
- 'Application name'
description:
type:
- string
- 'null'
examples:
- null
is_secret:
type: boolean
examples:
- false
is_encrypted:
type: boolean
examples:
- false
is_public:
type: boolean
examples:
- true
config_path:
type: string
examples:
- app.name
validation:
type: array
items:
type: string
examples:
-
- 'max:100'
sort_order:
type: integer
examples:
- 10
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 0d7997b1-efd3-4632-bc1f-9579037fc828
timestamp:
type: string
examples:
- '2026-08-05T16:18:42.584365Z'
examples:
-
status: SUCCESS
message: 'Setting updated successfully.'
data:
id: 019fd2b7-eea2-7183-91ff-569d302b80a5
key: app.name
value: Beispieltext
has_value: true
type: string
group: application
label: 'Application name'
description: null
is_secret: false
is_encrypted: false
is_public: true
config_path: app.name
validation:
- 'max:100'
sort_order: 10
errors: null
meta:
request_id: 0d7997b1-efd3-4632-bc1f-9579037fc828
timestamp: '2026-08-05T16:18:42.584365Z'
tags:
- 'Admin API'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
value:
type:
- string
- 'null'
description: ''
examples:
- Beispieltext
patch:
summary: "Update a single application setting identified by its key via\nroute-model binding ({setting:key})."
operationId: updateASingleApplicationSettingIdentifiedByItsKeyViaRouteModelBindingsettingkey
description: "- Authorisation is enforced through AppSettingPolicy::update so secret\n / privileged-group keys (stripe, mail, oauth, ...) require super_admin.\n- Validation rules are derived dynamically from the setting's own\n `validation` JSON column plus its declared `type`.\n- Encryption (when is_encrypted=true) is handled transparently by\n AppSetting::writeValue().\n- The settings cache is invalidated through SettingsService::set so the\n next request observes the new value."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Setting updated successfully.'
data:
type: object
properties:
id:
type: string
examples:
- 019fd2b7-eea2-7183-91ff-569d302b80a5
key:
type: string
examples:
- app.name
value:
type: string
examples:
- Beispieltext
has_value:
type: boolean
examples:
- true
type:
type: string
examples:
- string
group:
type: string
examples:
- application
label:
type: string
examples:
- 'Application name'
description:
type:
- string
- 'null'
examples:
- null
is_secret:
type: boolean
examples:
- false
is_encrypted:
type: boolean
examples:
- false
is_public:
type: boolean
examples:
- true
config_path:
type: string
examples:
- app.name
validation:
type: array
items:
type: string
examples:
-
- 'max:100'
sort_order:
type: integer
examples:
- 10
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 0d7997b1-efd3-4632-bc1f-9579037fc828
timestamp:
type: string
examples:
- '2026-08-05T16:18:42.584365Z'
examples:
-
status: SUCCESS
message: 'Setting updated successfully.'
data:
id: 019fd2b7-eea2-7183-91ff-569d302b80a5
key: app.name
value: Beispieltext
has_value: true
type: string
group: application
label: 'Application name'
description: null
is_secret: false
is_encrypted: false
is_public: true
config_path: app.name
validation:
- 'max:100'
sort_order: 10
errors: null
meta:
request_id: 0d7997b1-efd3-4632-bc1f-9579037fc828
timestamp: '2026-08-05T16:18:42.584365Z'
tags:
- 'Admin API'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
value:
type:
- string
- 'null'
description: ''
examples:
- Beispieltext
parameters:
-
in: path
name: setting_key
description: ''
required: true
schema:
type: string
examples:
- app.name
'/api/v1/admin/users/{user_id}/audit-logs':
get:
summary: "Shortcut endpoint that returns the audit history for a specific\nmobile user. Equivalent to calling ListAuditLogsAction with"
operationId: shortcutEndpointThatReturnsTheAuditHistoryForASpecificMobileUserEquivalentToCallingListAuditLogsActionWith
description: 'actor_type=User and actor_id={user}, but more ergonomic. * @group Admin API'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- Success
data:
type: array
examples:
- []
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 986148e1-fff0-482e-aaa0-5d41090efc2f
timestamp:
type: string
examples:
- '2026-08-05T16:18:41.836956Z'
current_page:
type: integer
examples:
- 1
last_page:
type: integer
examples:
- 1
per_page:
type: integer
examples:
- 25
total:
type: integer
examples:
- 0
examples:
-
status: SUCCESS
message: Success
data: []
errors: null
meta:
request_id: 986148e1-fff0-482e-aaa0-5d41090efc2f
timestamp: '2026-08-05T16:18:41.836956Z'
current_page: 1
last_page: 1
per_page: 25
total: 0
tags:
- 'Admin API'
parameters:
-
in: path
name: user_id
description: 'The ID of the user.'
required: true
schema:
type: string
examples:
- 019f0593-c75f-7265-bb3d-278a77f5a95f
/api/v1/admin/audit-logs:
get:
summary: 'Lists audit logs with filters on actor, event, IP, and date range.'
operationId: listsAuditLogsWithFiltersOnActorEventIPAndDateRange
description: "Results are paginated and sorted by occurred_at descending so the\n\nadmin UI shows the most recent events first. * @group Admin API"
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- Success
data:
type: array
items:
type: object
properties:
id:
type: string
examples:
- 019fd2b7-f16f-722a-a17a-a0e1db7deb06
event:
type: string
examples:
- model.created
actor_type:
type:
- string
- 'null'
examples:
- null
actor_id:
type:
- string
- 'null'
examples:
- null
actor_guard:
type:
- string
- 'null'
examples:
- null
subject_type:
type: string
examples:
- App\Domain\Employee\Models\EmployeeBankAccount
subject_id:
type: string
examples:
- 019fd2b7-f16e-704c-b219-414a49a200c8
ip_address:
type: string
examples:
- 127.0.0.1
user_agent:
type: string
examples:
- Symfony
session_token_id:
type:
- string
- 'null'
examples:
- null
metadata:
type: object
properties:
old_values:
type:
- string
- 'null'
examples:
- null
new_values:
type: object
properties:
user_id:
type: string
examples:
- 019fd2b7-f153-7131-a03e-8f1096bf7eeb
is_primary:
type: boolean
examples:
- true
iban:
type: string
examples:
- '***MASKED***'
bic:
type: string
examples:
- RLNWATWW
bank_name:
type: string
examples:
- 'Raiffeisen Bank'
account_holder:
type: string
examples:
- 'M*************'
verified_at:
type: string
examples:
- '2026-03-05 16:18:18'
is_verified:
type: boolean
examples:
- true
id:
type: string
examples:
- 019fd2b7-f16e-704c-b219-414a49a200c8
updated_at:
type: string
examples:
- '2026-08-05 16:18:18'
created_at:
type: string
examples:
- '2026-08-05 16:18:18'
correlation_id:
type:
- string
- 'null'
examples:
- null
occurred_at:
type: string
examples:
- '2026-08-05T16:18:17.000000Z'
examples:
-
-
id: 019fd2b7-f16f-722a-a17a-a0e1db7deb06
event: model.created
actor_type: null
actor_id: null
actor_guard: null
subject_type: App\Domain\Employee\Models\EmployeeBankAccount
subject_id: 019fd2b7-f16e-704c-b219-414a49a200c8
ip_address: 127.0.0.1
user_agent: Symfony
session_token_id: null
metadata:
old_values: null
new_values:
user_id: 019fd2b7-f153-7131-a03e-8f1096bf7eeb
is_primary: true
iban: '***MASKED***'
bic: RLNWATWW
bank_name: 'Raiffeisen Bank'
account_holder: 'M*************'
verified_at: '2026-03-05 16:18:18'
is_verified: true
id: 019fd2b7-f16e-704c-b219-414a49a200c8
updated_at: '2026-08-05 16:18:18'
created_at: '2026-08-05 16:18:18'
correlation_id: null
occurred_at: '2026-08-05T16:18:17.000000Z'
-
id: 019fd2b7-f174-723d-9443-de112a7d144a
event: model.created
actor_type: null
actor_id: null
actor_guard: null
subject_type: App\Domain\Employee\Models\EmployeeDocument
subject_id: 019fd2b7-f173-70ee-8312-3dfc81345d78
ip_address: 127.0.0.1
user_agent: Symfony
session_token_id: null
metadata:
old_values: null
new_values:
user_id: 019fd2b7-f153-7131-a03e-8f1096bf7eeb
type: id_card
original_filename: 'p*****************f'
storage_path: c0ecb9801dd5592ab1d5b796b45cf183ae7a3b2a00154bd87cd0d0f39f71b787
file_size: 306900
mime_type: application/pdf
status: verified
document_number: 'P******6'
expires_at: '2031-08-05 16:18:18'
reviewed_at: '2026-02-05 16:18:18'
id: 019fd2b7-f173-70ee-8312-3dfc81345d78
updated_at: '2026-08-05 16:18:18'
created_at: '2026-08-05 16:18:18'
correlation_id: null
occurred_at: '2026-08-05T16:18:17.000000Z'
-
id: 019fd2b7-f177-7063-a530-e7b1cbb65fe0
event: model.created
actor_type: null
actor_id: null
actor_guard: null
subject_type: App\Domain\Employee\Models\EmployeeDocument
subject_id: 019fd2b7-f176-71df-a915-724d63fbbf7b
ip_address: 127.0.0.1
user_agent: Symfony
session_token_id: null
metadata:
old_values: null
new_values:
user_id: 019fd2b7-f153-7131-a03e-8f1096bf7eeb
type: residence_permit
original_filename: 'a******************f'
storage_path: a1a163d574e16f564d36030b921157863ae59a9359cc46f01fc02abaebafac5f
file_size: 158747
mime_type: application/pdf
status: verified
document_number: 'A***********5'
expires_at: '2028-08-05 16:18:18'
reviewed_at: '2026-02-05 16:18:18'
id: 019fd2b7-f176-71df-a915-724d63fbbf7b
updated_at: '2026-08-05 16:18:18'
created_at: '2026-08-05 16:18:18'
correlation_id: null
occurred_at: '2026-08-05T16:18:17.000000Z'
-
id: 019fd2b7-f17b-71b8-8ce8-d07f4bac6cb2
event: model.created
actor_type: null
actor_id: null
actor_guard: null
subject_type: App\Domain\Employee\Models\EmployeeDocument
subject_id: 019fd2b7-f17a-711b-a732-08f306e90713
ip_address: 127.0.0.1
user_agent: Symfony
session_token_id: null
metadata:
old_values: null
new_values:
user_id: 019fd2b7-f153-7131-a03e-8f1096bf7eeb
type: social_insurance_card
original_filename: 'e********f'
storage_path: bd958714cff13dfbfeb1e81751a841391dfe7cfb351ea518bf39f9b74b6a8751
file_size: 118449
mime_type: application/pdf
status: verified
document_number: null
expires_at: null
reviewed_at: '2026-02-05 16:18:18'
id: 019fd2b7-f17a-711b-a732-08f306e90713
updated_at: '2026-08-05 16:18:18'
created_at: '2026-08-05 16:18:18'
correlation_id: null
occurred_at: '2026-08-05T16:18:17.000000Z'
-
id: 019fd2b7-f180-7174-a1df-07c27ea86e09
event: model.created
actor_type: null
actor_id: null
actor_guard: null
subject_type: App\Domain\Employee\Models\EmployeeQualification
subject_id: 019fd2b7-f17e-71c4-9e83-3bfb364ee6f5
ip_address: 127.0.0.1
user_agent: Symfony
session_token_id: null
metadata:
old_values: null
new_values:
user_id: 019fd2b7-f153-7131-a03e-8f1096bf7eeb
name: Lebensmittelhygiene-Schulung
description: HACCP-konform
issuing_organization: 'Wifi Wien'
credential_id: CERT-VSMQAWJD
issued_at: '2024-08-05 16:18:18'
expires_at: '2029-08-05 16:18:18'
is_verified: true
verified_at: '2026-03-05 16:18:18'
id: 019fd2b7-f17e-71c4-9e83-3bfb364ee6f5
updated_at: '2026-08-05 16:18:18'
created_at: '2026-08-05 16:18:18'
correlation_id: null
occurred_at: '2026-08-05T16:18:17.000000Z'
-
id: 019fd2b7-f183-72de-8fa6-ba8cb8c97a5e
event: model.created
actor_type: null
actor_id: null
actor_guard: null
subject_type: App\Domain\Employee\Models\EmployeeQualification
subject_id: 019fd2b7-f182-7351-9c68-f8069cc2b654
ip_address: 127.0.0.1
user_agent: Symfony
session_token_id: null
metadata:
old_values: null
new_values:
user_id: 019fd2b7-f153-7131-a03e-8f1096bf7eeb
name: 'Erste-Hilfe-Kurs (16h)'
description: 'Betrieblicher Ersthelfer'
issuing_organization: 'Rotes Kreuz'
credential_id: CERT-0GX09TN6
issued_at: '2025-08-05 16:18:18'
expires_at: '2027-08-05 16:18:18'
is_verified: true
verified_at: '2026-03-05 16:18:18'
id: 019fd2b7-f182-7351-9c68-f8069cc2b654
updated_at: '2026-08-05 16:18:18'
created_at: '2026-08-05 16:18:18'
correlation_id: null
occurred_at: '2026-08-05T16:18:17.000000Z'
-
id: 019fd2b7-f186-7171-9186-ecc5291b5720
event: model.created
actor_type: null
actor_id: null
actor_guard: null
subject_type: App\Domain\Employee\Models\EmployeeQualification
subject_id: 019fd2b7-f184-705f-902c-e3fe336e4696
ip_address: 127.0.0.1
user_agent: Symfony
session_token_id: null
metadata:
old_values: null
new_values:
user_id: 019fd2b7-f153-7131-a03e-8f1096bf7eeb
name: 'Führerschein Klasse B'
description: PKW
issuing_organization: 'Magistrat Wien'
credential_id: CERT-MMURVRZ9
issued_at: '2018-08-05 16:18:18'
expires_at: '2033-08-05 16:18:18'
is_verified: true
verified_at: '2026-03-05 16:18:18'
id: 019fd2b7-f184-705f-902c-e3fe336e4696
updated_at: '2026-08-05 16:18:18'
created_at: '2026-08-05 16:18:18'
correlation_id: null
occurred_at: '2026-08-05T16:18:17.000000Z'
-
id: 019fd2b7-f18a-7051-a1a0-f69915c7b971
event: model.created
actor_type: null
actor_id: null
actor_guard: null
subject_type: App\Domain\Employee\Models\LegalConsent
subject_id: 019fd2b7-f189-70a8-90e2-a0cd3bea33f9
ip_address: 127.0.0.1
user_agent: Symfony
session_token_id: null
metadata:
old_values: null
new_values:
user_id: 019fd2b7-f153-7131-a03e-8f1096bf7eeb
consent_type: terms_of_service
version: '1.0'
is_granted: true
ip_address: 192.168.1.1
user_agent: 'Mozilla/5.0 Flexxr/1.0'
id: 019fd2b7-f189-70a8-90e2-a0cd3bea33f9
correlation_id: null
occurred_at: '2026-08-05T16:18:17.000000Z'
-
id: 019fd2b7-f18f-713a-8653-ba9b92ae4893
event: model.created
actor_type: null
actor_id: null
actor_guard: null
subject_type: App\Domain\Employee\Models\LegalConsent
subject_id: 019fd2b7-f18d-7173-b3c9-a930482056cc
ip_address: 127.0.0.1
user_agent: Symfony
session_token_id: null
metadata:
old_values: null
new_values:
user_id: 019fd2b7-f153-7131-a03e-8f1096bf7eeb
consent_type: privacy_policy
version: '1.0'
is_granted: true
ip_address: 192.168.1.1
user_agent: 'Mozilla/5.0 Flexxr/1.0'
id: 019fd2b7-f18d-7173-b3c9-a930482056cc
correlation_id: null
occurred_at: '2026-08-05T16:18:17.000000Z'
-
id: 019fd2b7-f193-730e-9ea9-dc287d5a2138
event: model.created
actor_type: null
actor_id: null
actor_guard: null
subject_type: App\Domain\Employee\Models\LegalConsent
subject_id: 019fd2b7-f192-70a0-ad38-e7249a9072e9
ip_address: 127.0.0.1
user_agent: Symfony
session_token_id: null
metadata:
old_values: null
new_values:
user_id: 019fd2b7-f153-7131-a03e-8f1096bf7eeb
consent_type: data_processing
version: '1.0'
is_granted: true
ip_address: 192.168.1.1
user_agent: 'Mozilla/5.0 Flexxr/1.0'
id: 019fd2b7-f192-70a0-ad38-e7249a9072e9
correlation_id: null
occurred_at: '2026-08-05T16:18:17.000000Z'
-
id: 019fd2b7-f196-7342-8b80-22a97ced07f8
event: model.created
actor_type: null
actor_id: null
actor_guard: null
subject_type: App\Domain\Employee\Models\LegalConsent
subject_id: 019fd2b7-f195-70c4-8789-2a049d2c90e0
ip_address: 127.0.0.1
user_agent: Symfony
session_token_id: null
metadata:
old_values: null
new_values:
user_id: 019fd2b7-f153-7131-a03e-8f1096bf7eeb
consent_type: framework_contract
version: '1.0'
is_granted: true
ip_address: 192.168.1.1
user_agent: 'Mozilla/5.0 Flexxr/1.0'
id: 019fd2b7-f195-70c4-8789-2a049d2c90e0
correlation_id: null
occurred_at: '2026-08-05T16:18:17.000000Z'
-
id: 019fd2b7-f27c-72ac-b5bb-02c51b40af7b
event: model.created
actor_type: null
actor_id: null
actor_guard: null
subject_type: App\Domain\Employee\Models\EmployeeProfile
subject_id: 019fd2b7-f279-7142-a68d-0d4563a06070
ip_address: 127.0.0.1
user_agent: Symfony
session_token_id: null
metadata:
old_values: null
new_values:
user_id: 019fd2b7-f271-73fd-8268-848be381e136
status: pending_approval
date_of_birth: '1*****************0'
nationality: AT
address_line_1: '***REDACTED***'
postal_code: '4**0'
city: Linz
country: AT
svs_number: '***MASKED***'
id: 019fd2b7-f279-7142-a68d-0d4563a06070
updated_at: '2026-08-05 16:18:18'
created_at: '2026-08-05 16:18:18'
correlation_id: null
occurred_at: '2026-08-05T16:18:17.000000Z'
-
id: 019fd2b7-f283-701d-a54c-158235363ec0
event: model.created
actor_type: null
actor_id: null
actor_guard: null
subject_type: App\Domain\Employee\Models\EmployeeDocument
subject_id: 019fd2b7-f280-73fe-83af-4fdd5f9db332
ip_address: 127.0.0.1
user_agent: Symfony
session_token_id: null
metadata:
old_values: null
new_values:
user_id: 019fd2b7-f271-73fd-8268-848be381e136
type: id_card
original_filename: 'a*********f'
storage_path: 9155853482e609f840bdc816663625331d19feca66fdea30517b2e836a5078f8
file_size: 245000
mime_type: application/pdf
status: pending
id: 019fd2b7-f280-73fe-83af-4fdd5f9db332
updated_at: '2026-08-05 16:18:18'
created_at: '2026-08-05 16:18:18'
correlation_id: null
occurred_at: '2026-08-05T16:18:17.000000Z'
-
id: 019fd2b7-f288-7040-a457-b028861470d3
event: model.created
actor_type: null
actor_id: null
actor_guard: null
subject_type: App\Domain\Employee\Models\LegalConsent
subject_id: 019fd2b7-f286-701b-a4b6-2c2aff8e2daf
ip_address: 127.0.0.1
user_agent: Symfony
session_token_id: null
metadata:
old_values: null
new_values:
user_id: 019fd2b7-f271-73fd-8268-848be381e136
consent_type: terms_of_service
version: '1.0'
is_granted: true
ip_address: 192.168.1.100
id: 019fd2b7-f286-701b-a4b6-2c2aff8e2daf
correlation_id: null
occurred_at: '2026-08-05T16:18:17.000000Z'
-
id: 019fd2b7-f369-7004-afff-8a69186dc602
event: model.created
actor_type: null
actor_id: null
actor_guard: null
subject_type: App\Domain\Employee\Models\EmployeeProfile
subject_id: 019fd2b7-f367-70e0-95e4-16a395c2b4ec
ip_address: 127.0.0.1
user_agent: Symfony
session_token_id: null
metadata:
old_values: null
new_values:
user_id: 019fd2b7-f362-705a-bd7d-66b2f8394aa2
status: suspended
date_of_birth: '1*****************0'
nationality: AT
address_line_1: '***REDACTED***'
postal_code: '1**0'
city: Wien
country: AT
suspended_reason: 'Wiederholte No-Shows bei bestätigten Schichten'
id: 019fd2b7-f367-70e0-95e4-16a395c2b4ec
updated_at: '2026-08-05 16:18:18'
created_at: '2026-08-05 16:18:18'
correlation_id: null
occurred_at: '2026-08-05T16:18:17.000000Z'
-
id: 019fd2b7-f373-73e1-9170-f39694b52605
event: model.created
actor_type: null
actor_id: null
actor_guard: null
subject_type: App\Domain\Job\Models\JobCategory
subject_id: 019fd2b7-f371-732c-8cdb-6de13be42891
ip_address: 127.0.0.1
user_agent: Symfony
session_token_id: null
metadata:
old_values: null
new_values:
slug: gastro
name: Gastronomie
name_en: Gastronomy
icon: utensils
kollektivvertrag: Gastgewerbe
sort_order: 1
is_active: true
is_featured: true
id: 019fd2b7-f371-732c-8cdb-6de13be42891
updated_at: '2026-08-05 16:18:18'
created_at: '2026-08-05 16:18:18'
correlation_id: null
occurred_at: '2026-08-05T16:18:17.000000Z'
-
id: 019fd2b7-f375-724e-84b8-4f964842107a
event: model.created
actor_type: null
actor_id: null
actor_guard: null
subject_type: App\Domain\Job\Models\JobCategory
subject_id: 019fd2b7-f375-724e-84b8-4f9647ef6419
ip_address: 127.0.0.1
user_agent: Symfony
session_token_id: null
metadata:
old_values: null
new_values:
slug: hotel
name: Hotellerie
name_en: Hospitality
icon: hotel
kollektivvertrag: 'Hotel- und Gastgewerbe'
sort_order: 2
is_active: true
is_featured: true
id: 019fd2b7-f375-724e-84b8-4f9647ef6419
updated_at: '2026-08-05 16:18:18'
created_at: '2026-08-05 16:18:18'
correlation_id: null
occurred_at: '2026-08-05T16:18:17.000000Z'
-
id: 019fd2b7-f378-72e4-b49e-cfb1fc2a49b0
event: model.created
actor_type: null
actor_id: null
actor_guard: null
subject_type: App\Domain\Job\Models\JobCategory
subject_id: 019fd2b7-f377-7108-8400-efa89715a39f
ip_address: 127.0.0.1
user_agent: Symfony
session_token_id: null
metadata:
old_values: null
new_values:
slug: food_service
name: 'Food Service'
name_en: 'Food Service'
icon: utensils
kollektivvertrag: Gastgewerbe
sort_order: 3
is_active: true
is_featured: false
id: 019fd2b7-f377-7108-8400-efa89715a39f
updated_at: '2026-08-05 16:18:18'
created_at: '2026-08-05 16:18:18'
correlation_id: null
occurred_at: '2026-08-05T16:18:17.000000Z'
-
id: 019fd2b7-f37b-70a0-9864-944852d41e9f
event: model.created
actor_type: null
actor_id: null
actor_guard: null
subject_type: App\Domain\Job\Models\JobCategory
subject_id: 019fd2b7-f37a-72a9-84a9-7862f636e2fd
ip_address: 127.0.0.1
user_agent: Symfony
session_token_id: null
metadata:
old_values: null
new_values:
slug: catering
name: Catering
name_en: Catering
icon: utensils
kollektivvertrag: Gastgewerbe
sort_order: 4
is_active: true
is_featured: false
id: 019fd2b7-f37a-72a9-84a9-7862f636e2fd
updated_at: '2026-08-05 16:18:18'
created_at: '2026-08-05 16:18:18'
correlation_id: null
occurred_at: '2026-08-05T16:18:17.000000Z'
-
id: 019fd2b7-f37e-73e1-8bb1-161448fd23cd
event: model.created
actor_type: null
actor_id: null
actor_guard: null
subject_type: App\Domain\Job\Models\JobCategory
subject_id: 019fd2b7-f37d-712d-92b3-aa5540f6b2a7
ip_address: 127.0.0.1
user_agent: Symfony
session_token_id: null
metadata:
old_values: null
new_values:
slug: retail
name: Einzelhandel
name_en: Retail
icon: shopping-cart
kollektivvertrag: Handel
sort_order: 5
is_active: true
is_featured: false
id: 019fd2b7-f37d-712d-92b3-aa5540f6b2a7
updated_at: '2026-08-05 16:18:18'
created_at: '2026-08-05 16:18:18'
correlation_id: null
occurred_at: '2026-08-05T16:18:17.000000Z'
-
id: 019fd2b7-f381-70ee-b46d-57a550a4104d
event: model.created
actor_type: null
actor_id: null
actor_guard: null
subject_type: App\Domain\Job\Models\JobCategory
subject_id: 019fd2b7-f380-7300-91c6-75c968e6d045
ip_address: 127.0.0.1
user_agent: Symfony
session_token_id: null
metadata:
old_values: null
new_values:
slug: supermarket
name: Lebensmittelhandel
name_en: Grocery
icon: shopping-cart
kollektivvertrag: Handel
sort_order: 6
is_active: true
is_featured: false
id: 019fd2b7-f380-7300-91c6-75c968e6d045
updated_at: '2026-08-05 16:18:18'
created_at: '2026-08-05 16:18:18'
correlation_id: null
occurred_at: '2026-08-05T16:18:17.000000Z'
-
id: 019fd2b7-f385-7167-a529-4245dd301d44
event: model.created
actor_type: null
actor_id: null
actor_guard: null
subject_type: App\Domain\Job\Models\JobCategory
subject_id: 019fd2b7-f384-7071-b096-674d16b4ad00
ip_address: 127.0.0.1
user_agent: Symfony
session_token_id: null
metadata:
old_values: null
new_values:
slug: pharmacy
name: Apotheke
name_en: Pharmacy
icon: heart-pulse
kollektivvertrag: 'Pharmazeutischer Großhandel'
sort_order: 7
is_active: true
is_featured: false
id: 019fd2b7-f384-7071-b096-674d16b4ad00
updated_at: '2026-08-05 16:18:18'
created_at: '2026-08-05 16:18:18'
correlation_id: null
occurred_at: '2026-08-05T16:18:17.000000Z'
-
id: 019fd2b7-f389-7022-8c5e-bf2ea9173fe3
event: model.created
actor_type: null
actor_id: null
actor_guard: null
subject_type: App\Domain\Job\Models\JobCategory
subject_id: 019fd2b7-f388-7098-b463-ae170338e60f
ip_address: 127.0.0.1
user_agent: Symfony
session_token_id: null
metadata:
old_values: null
new_values:
slug: production
name: Produktion
name_en: Production
icon: industry
kollektivvertrag: Industrie
sort_order: 8
is_active: true
is_featured: false
id: 019fd2b7-f388-7098-b463-ae170338e60f
updated_at: '2026-08-05 16:18:18'
created_at: '2026-08-05 16:18:18'
correlation_id: null
occurred_at: '2026-08-05T16:18:17.000000Z'
-
id: 019fd2b7-f38c-7393-918e-19b1ae541bf2
event: model.created
actor_type: null
actor_id: null
actor_guard: null
subject_type: App\Domain\Job\Models\JobCategory
subject_id: 019fd2b7-f38b-7209-8b83-b345b172def2
ip_address: 127.0.0.1
user_agent: Symfony
session_token_id: null
metadata:
old_values: null
new_values:
slug: warehouse
name: Lager
name_en: Warehouse
icon: industry
kollektivvertrag: Industrie
sort_order: 9
is_active: true
is_featured: false
id: 019fd2b7-f38b-7209-8b83-b345b172def2
updated_at: '2026-08-05 16:18:18'
created_at: '2026-08-05 16:18:18'
correlation_id: null
occurred_at: '2026-08-05T16:18:17.000000Z'
-
id: 019fd2b7-f165-7231-8be6-f3c0c9d9acd0
event: model.created
actor_type: null
actor_id: null
actor_guard: null
subject_type: App\Domain\Employee\Models\EmployeeProfile
subject_id: 019fd2b7-f161-73ae-875c-d74efc63d8bb
ip_address: 127.0.0.1
user_agent: Symfony
session_token_id: null
metadata:
old_values: null
new_values:
user_id: 019fd2b7-f153-7131-a03e-8f1096bf7eeb
status: active
date_of_birth: '1*****************0'
nationality: AT
address_line_1: '***REDACTED***'
address_line_2: '***REDACTED***'
postal_code: '1**0'
city: Wien
country: AT
svs_number: '***MASKED***'
tax_id: 'e******************************************************************************************************************************************************************************************************9'
emergency_contact_name: 'M***************'
emergency_contact_phone: '********5678'
emergency_contact_relationship: Ehefrau
approved_at: '2026-02-05 16:18:18'
id: 019fd2b7-f161-73ae-875c-d74efc63d8bb
updated_at: '2026-08-05 16:18:18'
created_at: '2026-08-05 16:18:18'
correlation_id: null
occurred_at: '2026-08-05T16:18:17.000000Z'
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- af080157-9260-4732-8976-5e113b9c26d2
timestamp:
type: string
examples:
- '2026-08-05T16:18:42.488489Z'
current_page:
type: integer
examples:
- 1
last_page:
type: integer
examples:
- 72
per_page:
type: integer
examples:
- 25
total:
type: integer
examples:
- 1790
examples:
-
status: SUCCESS
message: Success
data:
-
id: 019fd2b7-f16f-722a-a17a-a0e1db7deb06
event: model.created
actor_type: null
actor_id: null
actor_guard: null
subject_type: App\Domain\Employee\Models\EmployeeBankAccount
subject_id: 019fd2b7-f16e-704c-b219-414a49a200c8
ip_address: 127.0.0.1
user_agent: Symfony
session_token_id: null
metadata:
old_values: null
new_values:
user_id: 019fd2b7-f153-7131-a03e-8f1096bf7eeb
is_primary: true
iban: '***MASKED***'
bic: RLNWATWW
bank_name: 'Raiffeisen Bank'
account_holder: 'M*************'
verified_at: '2026-03-05 16:18:18'
is_verified: true
id: 019fd2b7-f16e-704c-b219-414a49a200c8
updated_at: '2026-08-05 16:18:18'
created_at: '2026-08-05 16:18:18'
correlation_id: null
occurred_at: '2026-08-05T16:18:17.000000Z'
-
id: 019fd2b7-f174-723d-9443-de112a7d144a
event: model.created
actor_type: null
actor_id: null
actor_guard: null
subject_type: App\Domain\Employee\Models\EmployeeDocument
subject_id: 019fd2b7-f173-70ee-8312-3dfc81345d78
ip_address: 127.0.0.1
user_agent: Symfony
session_token_id: null
metadata:
old_values: null
new_values:
user_id: 019fd2b7-f153-7131-a03e-8f1096bf7eeb
type: id_card
original_filename: 'p*****************f'
storage_path: c0ecb9801dd5592ab1d5b796b45cf183ae7a3b2a00154bd87cd0d0f39f71b787
file_size: 306900
mime_type: application/pdf
status: verified
document_number: 'P******6'
expires_at: '2031-08-05 16:18:18'
reviewed_at: '2026-02-05 16:18:18'
id: 019fd2b7-f173-70ee-8312-3dfc81345d78
updated_at: '2026-08-05 16:18:18'
created_at: '2026-08-05 16:18:18'
correlation_id: null
occurred_at: '2026-08-05T16:18:17.000000Z'
-
id: 019fd2b7-f177-7063-a530-e7b1cbb65fe0
event: model.created
actor_type: null
actor_id: null
actor_guard: null
subject_type: App\Domain\Employee\Models\EmployeeDocument
subject_id: 019fd2b7-f176-71df-a915-724d63fbbf7b
ip_address: 127.0.0.1
user_agent: Symfony
session_token_id: null
metadata:
old_values: null
new_values:
user_id: 019fd2b7-f153-7131-a03e-8f1096bf7eeb
type: residence_permit
original_filename: 'a******************f'
storage_path: a1a163d574e16f564d36030b921157863ae59a9359cc46f01fc02abaebafac5f
file_size: 158747
mime_type: application/pdf
status: verified
document_number: 'A***********5'
expires_at: '2028-08-05 16:18:18'
reviewed_at: '2026-02-05 16:18:18'
id: 019fd2b7-f176-71df-a915-724d63fbbf7b
updated_at: '2026-08-05 16:18:18'
created_at: '2026-08-05 16:18:18'
correlation_id: null
occurred_at: '2026-08-05T16:18:17.000000Z'
-
id: 019fd2b7-f17b-71b8-8ce8-d07f4bac6cb2
event: model.created
actor_type: null
actor_id: null
actor_guard: null
subject_type: App\Domain\Employee\Models\EmployeeDocument
subject_id: 019fd2b7-f17a-711b-a732-08f306e90713
ip_address: 127.0.0.1
user_agent: Symfony
session_token_id: null
metadata:
old_values: null
new_values:
user_id: 019fd2b7-f153-7131-a03e-8f1096bf7eeb
type: social_insurance_card
original_filename: 'e********f'
storage_path: bd958714cff13dfbfeb1e81751a841391dfe7cfb351ea518bf39f9b74b6a8751
file_size: 118449
mime_type: application/pdf
status: verified
document_number: null
expires_at: null
reviewed_at: '2026-02-05 16:18:18'
id: 019fd2b7-f17a-711b-a732-08f306e90713
updated_at: '2026-08-05 16:18:18'
created_at: '2026-08-05 16:18:18'
correlation_id: null
occurred_at: '2026-08-05T16:18:17.000000Z'
-
id: 019fd2b7-f180-7174-a1df-07c27ea86e09
event: model.created
actor_type: null
actor_id: null
actor_guard: null
subject_type: App\Domain\Employee\Models\EmployeeQualification
subject_id: 019fd2b7-f17e-71c4-9e83-3bfb364ee6f5
ip_address: 127.0.0.1
user_agent: Symfony
session_token_id: null
metadata:
old_values: null
new_values:
user_id: 019fd2b7-f153-7131-a03e-8f1096bf7eeb
name: Lebensmittelhygiene-Schulung
description: HACCP-konform
issuing_organization: 'Wifi Wien'
credential_id: CERT-VSMQAWJD
issued_at: '2024-08-05 16:18:18'
expires_at: '2029-08-05 16:18:18'
is_verified: true
verified_at: '2026-03-05 16:18:18'
id: 019fd2b7-f17e-71c4-9e83-3bfb364ee6f5
updated_at: '2026-08-05 16:18:18'
created_at: '2026-08-05 16:18:18'
correlation_id: null
occurred_at: '2026-08-05T16:18:17.000000Z'
-
id: 019fd2b7-f183-72de-8fa6-ba8cb8c97a5e
event: model.created
actor_type: null
actor_id: null
actor_guard: null
subject_type: App\Domain\Employee\Models\EmployeeQualification
subject_id: 019fd2b7-f182-7351-9c68-f8069cc2b654
ip_address: 127.0.0.1
user_agent: Symfony
session_token_id: null
metadata:
old_values: null
new_values:
user_id: 019fd2b7-f153-7131-a03e-8f1096bf7eeb
name: 'Erste-Hilfe-Kurs (16h)'
description: 'Betrieblicher Ersthelfer'
issuing_organization: 'Rotes Kreuz'
credential_id: CERT-0GX09TN6
issued_at: '2025-08-05 16:18:18'
expires_at: '2027-08-05 16:18:18'
is_verified: true
verified_at: '2026-03-05 16:18:18'
id: 019fd2b7-f182-7351-9c68-f8069cc2b654
updated_at: '2026-08-05 16:18:18'
created_at: '2026-08-05 16:18:18'
correlation_id: null
occurred_at: '2026-08-05T16:18:17.000000Z'
-
id: 019fd2b7-f186-7171-9186-ecc5291b5720
event: model.created
actor_type: null
actor_id: null
actor_guard: null
subject_type: App\Domain\Employee\Models\EmployeeQualification
subject_id: 019fd2b7-f184-705f-902c-e3fe336e4696
ip_address: 127.0.0.1
user_agent: Symfony
session_token_id: null
metadata:
old_values: null
new_values:
user_id: 019fd2b7-f153-7131-a03e-8f1096bf7eeb
name: 'Führerschein Klasse B'
description: PKW
issuing_organization: 'Magistrat Wien'
credential_id: CERT-MMURVRZ9
issued_at: '2018-08-05 16:18:18'
expires_at: '2033-08-05 16:18:18'
is_verified: true
verified_at: '2026-03-05 16:18:18'
id: 019fd2b7-f184-705f-902c-e3fe336e4696
updated_at: '2026-08-05 16:18:18'
created_at: '2026-08-05 16:18:18'
correlation_id: null
occurred_at: '2026-08-05T16:18:17.000000Z'
-
id: 019fd2b7-f18a-7051-a1a0-f69915c7b971
event: model.created
actor_type: null
actor_id: null
actor_guard: null
subject_type: App\Domain\Employee\Models\LegalConsent
subject_id: 019fd2b7-f189-70a8-90e2-a0cd3bea33f9
ip_address: 127.0.0.1
user_agent: Symfony
session_token_id: null
metadata:
old_values: null
new_values:
user_id: 019fd2b7-f153-7131-a03e-8f1096bf7eeb
consent_type: terms_of_service
version: '1.0'
is_granted: true
ip_address: 192.168.1.1
user_agent: 'Mozilla/5.0 Flexxr/1.0'
id: 019fd2b7-f189-70a8-90e2-a0cd3bea33f9
correlation_id: null
occurred_at: '2026-08-05T16:18:17.000000Z'
-
id: 019fd2b7-f18f-713a-8653-ba9b92ae4893
event: model.created
actor_type: null
actor_id: null
actor_guard: null
subject_type: App\Domain\Employee\Models\LegalConsent
subject_id: 019fd2b7-f18d-7173-b3c9-a930482056cc
ip_address: 127.0.0.1
user_agent: Symfony
session_token_id: null
metadata:
old_values: null
new_values:
user_id: 019fd2b7-f153-7131-a03e-8f1096bf7eeb
consent_type: privacy_policy
version: '1.0'
is_granted: true
ip_address: 192.168.1.1
user_agent: 'Mozilla/5.0 Flexxr/1.0'
id: 019fd2b7-f18d-7173-b3c9-a930482056cc
correlation_id: null
occurred_at: '2026-08-05T16:18:17.000000Z'
-
id: 019fd2b7-f193-730e-9ea9-dc287d5a2138
event: model.created
actor_type: null
actor_id: null
actor_guard: null
subject_type: App\Domain\Employee\Models\LegalConsent
subject_id: 019fd2b7-f192-70a0-ad38-e7249a9072e9
ip_address: 127.0.0.1
user_agent: Symfony
session_token_id: null
metadata:
old_values: null
new_values:
user_id: 019fd2b7-f153-7131-a03e-8f1096bf7eeb
consent_type: data_processing
version: '1.0'
is_granted: true
ip_address: 192.168.1.1
user_agent: 'Mozilla/5.0 Flexxr/1.0'
id: 019fd2b7-f192-70a0-ad38-e7249a9072e9
correlation_id: null
occurred_at: '2026-08-05T16:18:17.000000Z'
-
id: 019fd2b7-f196-7342-8b80-22a97ced07f8
event: model.created
actor_type: null
actor_id: null
actor_guard: null
subject_type: App\Domain\Employee\Models\LegalConsent
subject_id: 019fd2b7-f195-70c4-8789-2a049d2c90e0
ip_address: 127.0.0.1
user_agent: Symfony
session_token_id: null
metadata:
old_values: null
new_values:
user_id: 019fd2b7-f153-7131-a03e-8f1096bf7eeb
consent_type: framework_contract
version: '1.0'
is_granted: true
ip_address: 192.168.1.1
user_agent: 'Mozilla/5.0 Flexxr/1.0'
id: 019fd2b7-f195-70c4-8789-2a049d2c90e0
correlation_id: null
occurred_at: '2026-08-05T16:18:17.000000Z'
-
id: 019fd2b7-f27c-72ac-b5bb-02c51b40af7b
event: model.created
actor_type: null
actor_id: null
actor_guard: null
subject_type: App\Domain\Employee\Models\EmployeeProfile
subject_id: 019fd2b7-f279-7142-a68d-0d4563a06070
ip_address: 127.0.0.1
user_agent: Symfony
session_token_id: null
metadata:
old_values: null
new_values:
user_id: 019fd2b7-f271-73fd-8268-848be381e136
status: pending_approval
date_of_birth: '1*****************0'
nationality: AT
address_line_1: '***REDACTED***'
postal_code: '4**0'
city: Linz
country: AT
svs_number: '***MASKED***'
id: 019fd2b7-f279-7142-a68d-0d4563a06070
updated_at: '2026-08-05 16:18:18'
created_at: '2026-08-05 16:18:18'
correlation_id: null
occurred_at: '2026-08-05T16:18:17.000000Z'
-
id: 019fd2b7-f283-701d-a54c-158235363ec0
event: model.created
actor_type: null
actor_id: null
actor_guard: null
subject_type: App\Domain\Employee\Models\EmployeeDocument
subject_id: 019fd2b7-f280-73fe-83af-4fdd5f9db332
ip_address: 127.0.0.1
user_agent: Symfony
session_token_id: null
metadata:
old_values: null
new_values:
user_id: 019fd2b7-f271-73fd-8268-848be381e136
type: id_card
original_filename: 'a*********f'
storage_path: 9155853482e609f840bdc816663625331d19feca66fdea30517b2e836a5078f8
file_size: 245000
mime_type: application/pdf
status: pending
id: 019fd2b7-f280-73fe-83af-4fdd5f9db332
updated_at: '2026-08-05 16:18:18'
created_at: '2026-08-05 16:18:18'
correlation_id: null
occurred_at: '2026-08-05T16:18:17.000000Z'
-
id: 019fd2b7-f288-7040-a457-b028861470d3
event: model.created
actor_type: null
actor_id: null
actor_guard: null
subject_type: App\Domain\Employee\Models\LegalConsent
subject_id: 019fd2b7-f286-701b-a4b6-2c2aff8e2daf
ip_address: 127.0.0.1
user_agent: Symfony
session_token_id: null
metadata:
old_values: null
new_values:
user_id: 019fd2b7-f271-73fd-8268-848be381e136
consent_type: terms_of_service
version: '1.0'
is_granted: true
ip_address: 192.168.1.100
id: 019fd2b7-f286-701b-a4b6-2c2aff8e2daf
correlation_id: null
occurred_at: '2026-08-05T16:18:17.000000Z'
-
id: 019fd2b7-f369-7004-afff-8a69186dc602
event: model.created
actor_type: null
actor_id: null
actor_guard: null
subject_type: App\Domain\Employee\Models\EmployeeProfile
subject_id: 019fd2b7-f367-70e0-95e4-16a395c2b4ec
ip_address: 127.0.0.1
user_agent: Symfony
session_token_id: null
metadata:
old_values: null
new_values:
user_id: 019fd2b7-f362-705a-bd7d-66b2f8394aa2
status: suspended
date_of_birth: '1*****************0'
nationality: AT
address_line_1: '***REDACTED***'
postal_code: '1**0'
city: Wien
country: AT
suspended_reason: 'Wiederholte No-Shows bei bestätigten Schichten'
id: 019fd2b7-f367-70e0-95e4-16a395c2b4ec
updated_at: '2026-08-05 16:18:18'
created_at: '2026-08-05 16:18:18'
correlation_id: null
occurred_at: '2026-08-05T16:18:17.000000Z'
-
id: 019fd2b7-f373-73e1-9170-f39694b52605
event: model.created
actor_type: null
actor_id: null
actor_guard: null
subject_type: App\Domain\Job\Models\JobCategory
subject_id: 019fd2b7-f371-732c-8cdb-6de13be42891
ip_address: 127.0.0.1
user_agent: Symfony
session_token_id: null
metadata:
old_values: null
new_values:
slug: gastro
name: Gastronomie
name_en: Gastronomy
icon: utensils
kollektivvertrag: Gastgewerbe
sort_order: 1
is_active: true
is_featured: true
id: 019fd2b7-f371-732c-8cdb-6de13be42891
updated_at: '2026-08-05 16:18:18'
created_at: '2026-08-05 16:18:18'
correlation_id: null
occurred_at: '2026-08-05T16:18:17.000000Z'
-
id: 019fd2b7-f375-724e-84b8-4f964842107a
event: model.created
actor_type: null
actor_id: null
actor_guard: null
subject_type: App\Domain\Job\Models\JobCategory
subject_id: 019fd2b7-f375-724e-84b8-4f9647ef6419
ip_address: 127.0.0.1
user_agent: Symfony
session_token_id: null
metadata:
old_values: null
new_values:
slug: hotel
name: Hotellerie
name_en: Hospitality
icon: hotel
kollektivvertrag: 'Hotel- und Gastgewerbe'
sort_order: 2
is_active: true
is_featured: true
id: 019fd2b7-f375-724e-84b8-4f9647ef6419
updated_at: '2026-08-05 16:18:18'
created_at: '2026-08-05 16:18:18'
correlation_id: null
occurred_at: '2026-08-05T16:18:17.000000Z'
-
id: 019fd2b7-f378-72e4-b49e-cfb1fc2a49b0
event: model.created
actor_type: null
actor_id: null
actor_guard: null
subject_type: App\Domain\Job\Models\JobCategory
subject_id: 019fd2b7-f377-7108-8400-efa89715a39f
ip_address: 127.0.0.1
user_agent: Symfony
session_token_id: null
metadata:
old_values: null
new_values:
slug: food_service
name: 'Food Service'
name_en: 'Food Service'
icon: utensils
kollektivvertrag: Gastgewerbe
sort_order: 3
is_active: true
is_featured: false
id: 019fd2b7-f377-7108-8400-efa89715a39f
updated_at: '2026-08-05 16:18:18'
created_at: '2026-08-05 16:18:18'
correlation_id: null
occurred_at: '2026-08-05T16:18:17.000000Z'
-
id: 019fd2b7-f37b-70a0-9864-944852d41e9f
event: model.created
actor_type: null
actor_id: null
actor_guard: null
subject_type: App\Domain\Job\Models\JobCategory
subject_id: 019fd2b7-f37a-72a9-84a9-7862f636e2fd
ip_address: 127.0.0.1
user_agent: Symfony
session_token_id: null
metadata:
old_values: null
new_values:
slug: catering
name: Catering
name_en: Catering
icon: utensils
kollektivvertrag: Gastgewerbe
sort_order: 4
is_active: true
is_featured: false
id: 019fd2b7-f37a-72a9-84a9-7862f636e2fd
updated_at: '2026-08-05 16:18:18'
created_at: '2026-08-05 16:18:18'
correlation_id: null
occurred_at: '2026-08-05T16:18:17.000000Z'
-
id: 019fd2b7-f37e-73e1-8bb1-161448fd23cd
event: model.created
actor_type: null
actor_id: null
actor_guard: null
subject_type: App\Domain\Job\Models\JobCategory
subject_id: 019fd2b7-f37d-712d-92b3-aa5540f6b2a7
ip_address: 127.0.0.1
user_agent: Symfony
session_token_id: null
metadata:
old_values: null
new_values:
slug: retail
name: Einzelhandel
name_en: Retail
icon: shopping-cart
kollektivvertrag: Handel
sort_order: 5
is_active: true
is_featured: false
id: 019fd2b7-f37d-712d-92b3-aa5540f6b2a7
updated_at: '2026-08-05 16:18:18'
created_at: '2026-08-05 16:18:18'
correlation_id: null
occurred_at: '2026-08-05T16:18:17.000000Z'
-
id: 019fd2b7-f381-70ee-b46d-57a550a4104d
event: model.created
actor_type: null
actor_id: null
actor_guard: null
subject_type: App\Domain\Job\Models\JobCategory
subject_id: 019fd2b7-f380-7300-91c6-75c968e6d045
ip_address: 127.0.0.1
user_agent: Symfony
session_token_id: null
metadata:
old_values: null
new_values:
slug: supermarket
name: Lebensmittelhandel
name_en: Grocery
icon: shopping-cart
kollektivvertrag: Handel
sort_order: 6
is_active: true
is_featured: false
id: 019fd2b7-f380-7300-91c6-75c968e6d045
updated_at: '2026-08-05 16:18:18'
created_at: '2026-08-05 16:18:18'
correlation_id: null
occurred_at: '2026-08-05T16:18:17.000000Z'
-
id: 019fd2b7-f385-7167-a529-4245dd301d44
event: model.created
actor_type: null
actor_id: null
actor_guard: null
subject_type: App\Domain\Job\Models\JobCategory
subject_id: 019fd2b7-f384-7071-b096-674d16b4ad00
ip_address: 127.0.0.1
user_agent: Symfony
session_token_id: null
metadata:
old_values: null
new_values:
slug: pharmacy
name: Apotheke
name_en: Pharmacy
icon: heart-pulse
kollektivvertrag: 'Pharmazeutischer Großhandel'
sort_order: 7
is_active: true
is_featured: false
id: 019fd2b7-f384-7071-b096-674d16b4ad00
updated_at: '2026-08-05 16:18:18'
created_at: '2026-08-05 16:18:18'
correlation_id: null
occurred_at: '2026-08-05T16:18:17.000000Z'
-
id: 019fd2b7-f389-7022-8c5e-bf2ea9173fe3
event: model.created
actor_type: null
actor_id: null
actor_guard: null
subject_type: App\Domain\Job\Models\JobCategory
subject_id: 019fd2b7-f388-7098-b463-ae170338e60f
ip_address: 127.0.0.1
user_agent: Symfony
session_token_id: null
metadata:
old_values: null
new_values:
slug: production
name: Produktion
name_en: Production
icon: industry
kollektivvertrag: Industrie
sort_order: 8
is_active: true
is_featured: false
id: 019fd2b7-f388-7098-b463-ae170338e60f
updated_at: '2026-08-05 16:18:18'
created_at: '2026-08-05 16:18:18'
correlation_id: null
occurred_at: '2026-08-05T16:18:17.000000Z'
-
id: 019fd2b7-f38c-7393-918e-19b1ae541bf2
event: model.created
actor_type: null
actor_id: null
actor_guard: null
subject_type: App\Domain\Job\Models\JobCategory
subject_id: 019fd2b7-f38b-7209-8b83-b345b172def2
ip_address: 127.0.0.1
user_agent: Symfony
session_token_id: null
metadata:
old_values: null
new_values:
slug: warehouse
name: Lager
name_en: Warehouse
icon: industry
kollektivvertrag: Industrie
sort_order: 9
is_active: true
is_featured: false
id: 019fd2b7-f38b-7209-8b83-b345b172def2
updated_at: '2026-08-05 16:18:18'
created_at: '2026-08-05 16:18:18'
correlation_id: null
occurred_at: '2026-08-05T16:18:17.000000Z'
-
id: 019fd2b7-f165-7231-8be6-f3c0c9d9acd0
event: model.created
actor_type: null
actor_id: null
actor_guard: null
subject_type: App\Domain\Employee\Models\EmployeeProfile
subject_id: 019fd2b7-f161-73ae-875c-d74efc63d8bb
ip_address: 127.0.0.1
user_agent: Symfony
session_token_id: null
metadata:
old_values: null
new_values:
user_id: 019fd2b7-f153-7131-a03e-8f1096bf7eeb
status: active
date_of_birth: '1*****************0'
nationality: AT
address_line_1: '***REDACTED***'
address_line_2: '***REDACTED***'
postal_code: '1**0'
city: Wien
country: AT
svs_number: '***MASKED***'
tax_id: 'e******************************************************************************************************************************************************************************************************9'
emergency_contact_name: 'M***************'
emergency_contact_phone: '********5678'
emergency_contact_relationship: Ehefrau
approved_at: '2026-02-05 16:18:18'
id: 019fd2b7-f161-73ae-875c-d74efc63d8bb
updated_at: '2026-08-05 16:18:18'
created_at: '2026-08-05 16:18:18'
correlation_id: null
occurred_at: '2026-08-05T16:18:17.000000Z'
errors: null
meta:
request_id: af080157-9260-4732-8976-5e113b9c26d2
timestamp: '2026-08-05T16:18:42.488489Z'
current_page: 1
last_page: 72
per_page: 25
total: 1790
tags:
- 'Admin API'
/api/v1/admin/audit-logs/export:
get:
summary: 'Export Audit Logs'
operationId: exportAuditLogs
description: "Streams audit logs as a CSV download, honoring the same filters as the\nlist endpoint."
parameters:
-
in: query
name: actor_type
description: 'Filter by actor class.'
required: false
schema:
type: string
description: 'Filter by actor class.'
examples:
- App\\Domain\\User\\Models\\User
-
in: query
name: actor_id
description: 'Filter by actor id.'
required: false
schema:
type: string
description: 'Filter by actor id.'
examples:
- 9b2c3d4e-5f6a-7b8c-9d0e-1f2a3b4c5d6e
-
in: query
name: subject_type
description: 'Filter by subject class.'
required: false
schema:
type: string
description: 'Filter by subject class.'
examples:
- App\\Domain\\Organization\\Models\\Organization
-
in: query
name: subject_id
description: 'Filter by subject id (UUID).'
required: false
schema:
type: string
description: 'Filter by subject id (UUID).'
examples:
- 9b2c3d4e-5f6a-7b8c-9d0e-1f2a3b4c5d6e
-
in: query
name: event
description: 'Filter by AuditEvent value.'
required: false
schema:
type: string
description: 'Filter by AuditEvent value.'
examples:
- login.failed
-
in: query
name: from
description: 'ISO-8601 lower bound for occurred_at.'
required: false
schema:
type: string
description: 'ISO-8601 lower bound for occurred_at.'
examples:
- '2026-04-01T00:00:00Z'
-
in: query
name: to
description: 'ISO-8601 upper bound for occurred_at.'
required: false
schema:
type: string
description: 'ISO-8601 upper bound for occurred_at.'
examples:
- '2026-04-30T23:59:59Z'
-
in: query
name: ip_address
description: 'Filter by client IP.'
required: false
schema:
type: string
description: 'Filter by client IP.'
examples:
- 203.0.113.42
responses:
503:
description: ''
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- ERROR
message:
type: string
examples:
- 'Service Unavailable'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type:
- string
- 'null'
examples:
- null
message:
type: string
examples:
- 'Service Unavailable'
examples:
-
-
field: null
message: 'Service Unavailable'
meta:
type: object
properties:
request_id:
type: string
examples:
- 6e0665b2-afbf-4bce-b235-2956571a8731
timestamp:
type: string
examples:
- '2026-08-21T05:14:36.328392Z'
examples:
-
status: ERROR
message: 'Service Unavailable'
data: null
errors:
-
field: null
message: 'Service Unavailable'
meta:
request_id: 6e0665b2-afbf-4bce-b235-2956571a8731
timestamp: '2026-08-21T05:14:36.328392Z'
tags:
- 'Admin API'
'/api/v1/admin/audit-logs/{auditLog_id}':
get:
summary: 'Returns a single audit log row by id. * @group Admin API'
operationId: returnsASingleAuditLogRowByIdgroupAdminAPI
description: ''
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- Success
data:
type: object
properties:
id:
type: string
examples:
- 019fd2b7-f165-7231-8be6-f3c0c9d9acd0
event:
type: string
examples:
- model.created
actor_type:
type:
- string
- 'null'
examples:
- null
actor_id:
type:
- string
- 'null'
examples:
- null
actor_guard:
type:
- string
- 'null'
examples:
- null
subject_type:
type: string
examples:
- App\Domain\Employee\Models\EmployeeProfile
subject_id:
type: string
examples:
- 019fd2b7-f161-73ae-875c-d74efc63d8bb
ip_address:
type: string
examples:
- 127.0.0.1
user_agent:
type: string
examples:
- Symfony
session_token_id:
type:
- string
- 'null'
examples:
- null
metadata:
type: object
properties:
old_values:
type:
- string
- 'null'
examples:
- null
new_values:
type: object
properties:
user_id:
type: string
examples:
- 019fd2b7-f153-7131-a03e-8f1096bf7eeb
status:
type: string
examples:
- active
date_of_birth:
type: string
examples:
- '1*****************0'
nationality:
type: string
examples:
- AT
address_line_1:
type: string
examples:
- '***REDACTED***'
address_line_2:
type: string
examples:
- '***REDACTED***'
postal_code:
type: string
examples:
- '1**0'
city:
type: string
examples:
- Wien
country:
type: string
examples:
- AT
svs_number:
type: string
examples:
- '***MASKED***'
tax_id:
type: string
examples:
- 'e******************************************************************************************************************************************************************************************************9'
emergency_contact_name:
type: string
examples:
- 'M***************'
emergency_contact_phone:
type: string
examples:
- '********5678'
emergency_contact_relationship:
type: string
examples:
- Ehefrau
approved_at:
type: string
examples:
- '2026-02-05 16:18:18'
id:
type: string
examples:
- 019fd2b7-f161-73ae-875c-d74efc63d8bb
updated_at:
type: string
examples:
- '2026-08-05 16:18:18'
created_at:
type: string
examples:
- '2026-08-05 16:18:18'
correlation_id:
type:
- string
- 'null'
examples:
- null
occurred_at:
type: string
examples:
- '2026-08-05T16:18:17.000000Z'
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 6ad4d966-cec8-4745-a221-d1cb548a92f5
timestamp:
type: string
examples:
- '2026-08-05T16:18:42.503197Z'
examples:
-
status: SUCCESS
message: Success
data:
id: 019fd2b7-f165-7231-8be6-f3c0c9d9acd0
event: model.created
actor_type: null
actor_id: null
actor_guard: null
subject_type: App\Domain\Employee\Models\EmployeeProfile
subject_id: 019fd2b7-f161-73ae-875c-d74efc63d8bb
ip_address: 127.0.0.1
user_agent: Symfony
session_token_id: null
metadata:
old_values: null
new_values:
user_id: 019fd2b7-f153-7131-a03e-8f1096bf7eeb
status: active
date_of_birth: '1*****************0'
nationality: AT
address_line_1: '***REDACTED***'
address_line_2: '***REDACTED***'
postal_code: '1**0'
city: Wien
country: AT
svs_number: '***MASKED***'
tax_id: 'e******************************************************************************************************************************************************************************************************9'
emergency_contact_name: 'M***************'
emergency_contact_phone: '********5678'
emergency_contact_relationship: Ehefrau
approved_at: '2026-02-05 16:18:18'
id: 019fd2b7-f161-73ae-875c-d74efc63d8bb
updated_at: '2026-08-05 16:18:18'
created_at: '2026-08-05 16:18:18'
correlation_id: null
occurred_at: '2026-08-05T16:18:17.000000Z'
errors: null
meta:
request_id: 6ad4d966-cec8-4745-a221-d1cb548a92f5
timestamp: '2026-08-05T16:18:42.503197Z'
tags:
- 'Admin API'
parameters:
-
in: path
name: auditLog_id
description: 'The ID of the auditLog.'
required: true
schema:
type: string
examples:
- 019f0593-c66e-7141-a832-edbf690fced6
'/api/v1/admin/users/{user_id}/anonymize':
post:
summary: 'Admin-triggered GDPR Art. 17 (Right to Erasure) anonymization.'
operationId: adminTriggeredGDPRArt17RightToErasureAnonymization
description: "Overwrites all PII on the user with non-identifying placeholders,\ndeactivates the account, and revokes all active Sanctum tokens.\nA mandatory reason is required and is recorded in the audit log.\n\nThis operation is irreversible. Foreign-key relationships (donations,\n\nfavourites) are preserved for legal and accounting purposes. * @group Admin API"
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'User anonymised successfully.'
data:
type: object
properties:
id:
type: string
examples:
- 019fd2b7-f271-73fd-8268-848be381e136
first_name:
type: string
examples:
- Anonymized
last_name:
type: string
examples:
- User
email:
type: string
examples:
- anonymized-019fd2b7-f271-73fd-8268-848be381e136@flexxr.invalid
country_code:
type:
- string
- 'null'
examples:
- null
phone_number:
type:
- string
- 'null'
examples:
- null
status:
type: string
examples:
- deactivated
avatar_url:
type:
- string
- 'null'
examples:
- null
bio:
type:
- string
- 'null'
examples:
- null
date_of_birth:
type:
- string
- 'null'
examples:
- null
country:
type:
- string
- 'null'
examples:
- null
city:
type:
- string
- 'null'
examples:
- null
notify_push:
type: boolean
examples:
- true
notify_email:
type: boolean
examples:
- true
notify_sms:
type: boolean
examples:
- true
notify_marketing:
type: boolean
examples:
- false
email_verified_at:
type: string
examples:
- '2026-08-05T16:18:32+00:00'
phone_verified_at:
type: string
examples:
- '2026-08-05T16:18:32+00:00'
created_at:
type: string
examples:
- '2026-08-05T16:18:18+00:00'
updated_at:
type: string
examples:
- '2026-08-05T16:18:41+00:00'
employee_profile:
type:
- string
- 'null'
examples:
- null
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 942e6a6d-9d0c-4a4f-bc5e-e1de244412e6
timestamp:
type: string
examples:
- '2026-08-05T16:18:41.761914Z'
examples:
-
status: SUCCESS
message: 'User anonymised successfully.'
data:
id: 019fd2b7-f271-73fd-8268-848be381e136
first_name: Anonymized
last_name: User
email: anonymized-019fd2b7-f271-73fd-8268-848be381e136@flexxr.invalid
country_code: null
phone_number: null
status: deactivated
avatar_url: null
bio: null
date_of_birth: null
country: null
city: null
notify_push: true
notify_email: true
notify_sms: true
notify_marketing: false
email_verified_at: '2026-08-05T16:18:32+00:00'
phone_verified_at: '2026-08-05T16:18:32+00:00'
created_at: '2026-08-05T16:18:18+00:00'
updated_at: '2026-08-05T16:18:41+00:00'
employee_profile: null
errors: null
meta:
request_id: 942e6a6d-9d0c-4a4f-bc5e-e1de244412e6
timestamp: '2026-08-05T16:18:41.761914Z'
tags:
- 'Admin API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
reason:
type: string
description: ''
examples:
- 'Krankheitsbedingt kurzfristig abgesagt.'
required:
- reason
parameters:
-
in: path
name: user_id
description: 'The ID of the user.'
required: true
schema:
type: string
examples:
- 019f0593-c75f-7265-bb3d-278a77f5a95f
'/api/v1/admin/users/{user_id}/export':
get:
summary: 'Admin-triggered GDPR Art. 15 (Right of Access) data export.'
operationId: adminTriggeredGDPRArt15RightOfAccessDataExport
description: "Compiles everything the platform holds about a user into a single\nJSON envelope. The frontend handles the JSON → file download step\n\nclient-side; no streaming is required for v1. * @group Admin API"
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'User data exported successfully.'
data:
type: object
properties:
export_metadata:
type: object
properties:
schema_version:
type: string
examples:
- '2.1'
export_type:
type: string
examples:
- admin_assisted
exported_at:
type: string
examples:
- '2026-08-05T16:18:41.777945Z'
exported_by_admin_id:
type: string
examples:
- 019fd2b7-edab-7280-b09f-b18f58a272ee
data_subject_id:
type: string
examples:
- 019fd2b7-f271-73fd-8268-848be381e136
controller:
type: object
properties:
name:
type: string
examples:
- Flexxer
address:
type: string
examples:
- 'Musterstraße 1, 1010 Wien, Österreich'
fn:
type: string
examples:
- 'FN 123456x'
uid:
type: string
examples:
- ATU12345678
privacy_contact:
type: string
examples:
- privacy@flexxr.at
support_contact:
type: string
examples:
- support@flexxr.at
legal_basis:
type: object
properties:
access:
type: string
examples:
- 'GDPR Art. 15 (Right of access)'
portability:
type: string
examples:
- 'GDPR Art. 20 (Right to data portability)'
rights_summary:
type: object
properties:
access:
type: string
examples:
- 'Art. 15 — request a copy of your data (this export)'
rectification:
type: string
examples:
- 'Art. 16 — request correction of inaccurate data'
erasure:
type: string
examples:
- 'Art. 17 — request deletion / anonymisation of your account'
portability:
type: string
examples:
- 'Art. 20 — receive your data in a machine-readable format'
objection:
type: string
examples:
- 'Art. 21 — object to processing based on legitimate interests'
retention_periods:
type: object
properties:
account_data:
type: string
examples:
- '3 years after last activity'
audit_logs:
type: string
examples:
- '7 years'
donation_receipts:
type: string
examples:
- '7 years (fiscal obligation)'
session_tokens:
type: string
examples:
- '90 days from last use'
profile:
type: object
properties:
id:
type: string
examples:
- 019fd2b7-f271-73fd-8268-848be381e136
email:
type: string
examples:
- pending@demo.flexxr.at
first_name:
type: string
examples:
- Anna
last_name:
type: string
examples:
- Neuling
phone_number:
type: string
examples:
- '6769876543'
email_verified_at:
type: string
examples:
- '2026-08-05T16:18:32.000000Z'
created_at:
type: string
examples:
- '2026-08-05T16:18:18.000000Z'
consents:
type: object
properties:
notify_push:
type: boolean
examples:
- true
notify_email:
type: boolean
examples:
- true
notify_sms:
type: boolean
examples:
- true
notify_marketing:
type: boolean
examples:
- false
audit_trail:
type: array
examples:
- []
notifications:
type: array
examples:
- []
sessions:
type: array
items:
type: object
properties:
name:
type: string
examples:
- docs
created_at:
type: string
examples:
- '2026-08-05 16:18:33'
examples:
-
-
name: docs
created_at: '2026-08-05 16:18:33'
social_accounts:
type: array
examples:
- []
two_factor:
type: object
properties:
method:
type: string
examples:
- totp
is_enabled:
type: boolean
examples:
- true
confirmed_at:
type: string
examples:
- '2026-08-05T16:18:32.000000Z'
recovery_codes_remaining:
type: integer
examples:
- 2
donations:
type: array
examples:
- []
recurring_donations:
type: array
examples:
- []
donation_receipts:
type: array
examples:
- []
favourites:
type: array
examples:
- []
contact_messages:
type: array
examples:
- []
support_tickets:
type: array
examples:
- []
legal_acceptances:
type: array
examples:
- []
exported_at:
type: string
examples:
- '2026-08-05T16:18:41.778035Z'
exported_by_admin_id:
type: string
examples:
- 019fd2b7-edab-7280-b09f-b18f58a272ee
exported_by_self:
type: boolean
examples:
- false
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 5fa38b28-b605-4d05-80c8-464f916d5eb5
timestamp:
type: string
examples:
- '2026-08-05T16:18:41.783098Z'
examples:
-
status: SUCCESS
message: 'User data exported successfully.'
data:
export_metadata:
schema_version: '2.1'
export_type: admin_assisted
exported_at: '2026-08-05T16:18:41.777945Z'
exported_by_admin_id: 019fd2b7-edab-7280-b09f-b18f58a272ee
data_subject_id: 019fd2b7-f271-73fd-8268-848be381e136
controller:
name: Flexxer
address: 'Musterstraße 1, 1010 Wien, Österreich'
fn: 'FN 123456x'
uid: ATU12345678
privacy_contact: privacy@flexxr.at
support_contact: support@flexxr.at
legal_basis:
access: 'GDPR Art. 15 (Right of access)'
portability: 'GDPR Art. 20 (Right to data portability)'
rights_summary:
access: 'Art. 15 — request a copy of your data (this export)'
rectification: 'Art. 16 — request correction of inaccurate data'
erasure: 'Art. 17 — request deletion / anonymisation of your account'
portability: 'Art. 20 — receive your data in a machine-readable format'
objection: 'Art. 21 — object to processing based on legitimate interests'
retention_periods:
account_data: '3 years after last activity'
audit_logs: '7 years'
donation_receipts: '7 years (fiscal obligation)'
session_tokens: '90 days from last use'
profile:
id: 019fd2b7-f271-73fd-8268-848be381e136
email: pending@demo.flexxr.at
first_name: Anna
last_name: Neuling
phone_number: '6769876543'
email_verified_at: '2026-08-05T16:18:32.000000Z'
created_at: '2026-08-05T16:18:18.000000Z'
consents:
notify_push: true
notify_email: true
notify_sms: true
notify_marketing: false
audit_trail: []
notifications: []
sessions:
-
name: docs
created_at: '2026-08-05 16:18:33'
social_accounts: []
two_factor:
method: totp
is_enabled: true
confirmed_at: '2026-08-05T16:18:32.000000Z'
recovery_codes_remaining: 2
donations: []
recurring_donations: []
donation_receipts: []
favourites: []
contact_messages: []
support_tickets: []
legal_acceptances: []
exported_at: '2026-08-05T16:18:41.778035Z'
exported_by_admin_id: 019fd2b7-edab-7280-b09f-b18f58a272ee
exported_by_self: false
errors: null
meta:
request_id: 5fa38b28-b605-4d05-80c8-464f916d5eb5
timestamp: '2026-08-05T16:18:41.783098Z'
tags:
- 'Admin API'
parameters:
-
in: path
name: user_id
description: 'The ID of the user.'
required: true
schema:
type: string
examples:
- 019f0593-c75f-7265-bb3d-278a77f5a95f
'/api/v1/admin/users/{user_id}/restrict':
post:
summary: 'Restrict User Processing'
operationId: restrictUserProcessing
description: "Flags the user's data as processing-restricted under GDPR Art. 18."
parameters: []
responses: { }
tags:
- 'Admin API'
delete:
summary: 'Lift User Processing Restriction'
operationId: liftUserProcessingRestriction
description: 'Clears the processing-restricted flag on the user.'
parameters: []
responses: { }
tags:
- 'Admin API'
parameters:
-
in: path
name: user_id
description: 'The ID of the user.'
required: true
schema:
type: string
examples:
- 019f0593-c75f-7265-bb3d-278a77f5a95f
-
in: path
name: user
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
/api/v1/admin/gdpr/org-requests:
get:
summary: 'List Org GDPR Requests'
operationId: listOrgGDPRRequests
description: "Paginated queue of GDPR requests forwarded by organisations on behalf\nof a donor/data subject, optionally filtered by status, request type,\nor organisation."
parameters:
-
in: query
name: status
description: 'Filter by status: pending|in_progress|resolved|rejected.'
required: false
schema:
type: string
description: 'Filter by status: pending|in_progress|resolved|rejected.'
examples:
- pending
-
in: query
name: type
description: 'Filter by request type: access|erasure|restriction|rectification.'
required: false
schema:
type: string
description: 'Filter by request type: access|erasure|restriction|rectification.'
examples:
- access
-
in: query
name: organization_id
description: 'Filter by organisation.'
required: false
schema:
type: string
description: 'Filter by organisation.'
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
-
in: query
name: per_page
description: 'Items per page (max 50).'
required: false
schema:
type: integer
description: 'Items per page (max 50).'
examples:
- 20
responses:
503:
description: ''
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- ERROR
message:
type: string
examples:
- 'Service Unavailable'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type:
- string
- 'null'
examples:
- null
message:
type: string
examples:
- 'Service Unavailable'
examples:
-
-
field: null
message: 'Service Unavailable'
meta:
type: object
properties:
request_id:
type: string
examples:
- 07ec46f6-66c0-43dd-ae6d-08ad888de3cb
timestamp:
type: string
examples:
- '2026-08-21T05:14:35.638439Z'
examples:
-
status: ERROR
message: 'Service Unavailable'
data: null
errors:
-
field: null
message: 'Service Unavailable'
meta:
request_id: 07ec46f6-66c0-43dd-ae6d-08ad888de3cb
timestamp: '2026-08-21T05:14:35.638439Z'
tags:
- 'Admin API'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
status:
type: string
description: ''
enum:
- pending
- in_progress
- resolved
- rejected
examples:
- rejected
type:
type: string
description: ''
enum:
- access
- erasure
- restriction
- rectification
examples:
- restriction
organization_id:
type: string
description: 'Must be a valid UUID.'
examples:
- 6ff8f7f6-1eb3-3525-be4a-3932c805afed
'/api/v1/admin/gdpr/org-requests/{orgGdprRequest_id}/status':
post:
summary: 'Update Org GDPR Request Status'
operationId: updateOrgGDPRRequestStatus
description: "Move an org-forwarded GDPR request into progress, resolve it, or\nreject it with an optional platform note."
parameters: []
responses:
422:
description: 'Invalid status'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- VALIDATION_ERROR
message:
type: string
examples:
- 'The status field is invalid.'
examples:
-
status: VALIDATION_ERROR
message: 'The status field is invalid.'
tags:
- 'Admin API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
status:
type: string
description: 'One of in_progress, resolved, rejected.'
examples:
- resolved
platform_note:
type:
- string
- 'null'
description: ''
examples:
- 'Deletion completed and confirmed to the organisation.'
required:
- status
parameters:
-
in: path
name: orgGdprRequest_id
description: 'The ID of the orgGdprRequest.'
required: true
schema:
type: string
examples:
- architecto
-
in: path
name: orgGdprRequest
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
/api/v1/admin/gdpr/user-requests:
get:
summary: 'List Worker GDPR Requests'
operationId: listWorkerGDPRRequests
description: "Paginated queue of GDPR rights requests raised directly by workers,\noptionally filtered by status, request type, or user. Each row\nincludes `sla_days_remaining` against the Art. 12(3) one-month\nresponse deadline."
parameters:
-
in: query
name: status
description: 'Filter by status: pending|in_progress|resolved|rejected.'
required: false
schema:
type: string
description: 'Filter by status: pending|in_progress|resolved|rejected.'
examples:
- pending
-
in: query
name: type
description: 'Filter by request type: rectification|restriction|objection|other.'
required: false
schema:
type: string
description: 'Filter by request type: rectification|restriction|objection|other.'
examples:
- restriction
-
in: query
name: user_id
description: 'Filter by worker.'
required: false
schema:
type: string
description: 'Filter by worker.'
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
-
in: query
name: per_page
description: 'Items per page (max 50).'
required: false
schema:
type: integer
description: 'Items per page (max 50).'
examples:
- 20
responses:
503:
description: ''
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- ERROR
message:
type: string
examples:
- 'Service Unavailable'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type:
- string
- 'null'
examples:
- null
message:
type: string
examples:
- 'Service Unavailable'
examples:
-
-
field: null
message: 'Service Unavailable'
meta:
type: object
properties:
request_id:
type: string
examples:
- 50b4baf4-7a3c-40a6-9fe6-009be5467bba
timestamp:
type: string
examples:
- '2026-08-21T05:14:35.661280Z'
examples:
-
status: ERROR
message: 'Service Unavailable'
data: null
errors:
-
field: null
message: 'Service Unavailable'
meta:
request_id: 50b4baf4-7a3c-40a6-9fe6-009be5467bba
timestamp: '2026-08-21T05:14:35.661280Z'
tags:
- 'Admin API'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
status:
type: string
description: ''
enum:
- pending
- in_progress
- resolved
- rejected
examples:
- in_progress
type:
type: string
description: ''
enum:
- rectification
- restriction
- objection
- other
examples:
- rectification
user_id:
type: string
description: 'Must be a valid UUID.'
examples:
- 6ff8f7f6-1eb3-3525-be4a-3932c805afed
'/api/v1/admin/gdpr/user-requests/{userGdprRequest_id}/status':
post:
summary: 'Update Worker GDPR Request Status'
operationId: updateWorkerGDPRRequestStatus
description: ''
parameters: []
responses:
422:
description: 'Invalid status'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- VALIDATION_ERROR
message:
type: string
examples:
- 'The status field is invalid.'
examples:
-
status: VALIDATION_ERROR
message: 'The status field is invalid.'
tags:
- 'Admin API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
status:
type: string
description: 'One of in_progress, resolved, rejected.'
examples:
- resolved
platform_note:
type:
- string
- 'null'
description: ''
examples:
- 'Adresse wurde korrigiert.'
required:
- status
parameters:
-
in: path
name: userGdprRequest_id
description: 'The ID of the userGdprRequest.'
required: true
schema:
type: string
examples:
- 019fe6e4-bbcd-71fd-918b-effe04df4ff9
-
in: path
name: userGdprRequest
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
/api/v1/admin/gdpr/deletion-requests:
get:
summary: 'List GDPR Deletion Requests'
operationId: listGDPRDeletionRequests
description: "Users with a scheduled data-retention horizon, ordered by how soon it\nfalls due."
parameters:
-
in: query
name: per_page
description: 'Items per page (max 50).'
required: false
schema:
type: integer
description: 'Items per page (max 50).'
examples:
- 20
responses:
503:
description: ''
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- ERROR
message:
type: string
examples:
- 'Service Unavailable'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type:
- string
- 'null'
examples:
- null
message:
type: string
examples:
- 'Service Unavailable'
examples:
-
-
field: null
message: 'Service Unavailable'
meta:
type: object
properties:
request_id:
type: string
examples:
- fce2f915-1e78-4278-97ce-28b10af4dac9
timestamp:
type: string
examples:
- '2026-08-21T05:14:35.679123Z'
examples:
-
status: ERROR
message: 'Service Unavailable'
data: null
errors:
-
field: null
message: 'Service Unavailable'
meta:
request_id: fce2f915-1e78-4278-97ce-28b10af4dac9
timestamp: '2026-08-21T05:14:35.679123Z'
tags:
- 'Admin API'
/api/v1/admin/gdpr/exports:
get:
summary: 'List GDPR Data Exports'
operationId: listGDPRDataExports
description: "Paginated queue of asynchronous GDPR data-export requests, optionally\nfiltered by status or user."
parameters:
-
in: query
name: status
description: 'Filter by status: pending|processing|ready|failed|expired.'
required: false
schema:
type: string
description: 'Filter by status: pending|processing|ready|failed|expired.'
examples:
- ready
-
in: query
name: user_id
description: 'Filter by user.'
required: false
schema:
type: string
description: 'Filter by user.'
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
-
in: query
name: per_page
description: 'Items per page (max 50).'
required: false
schema:
type: integer
description: 'Items per page (max 50).'
examples:
- 20
responses:
503:
description: ''
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- ERROR
message:
type: string
examples:
- 'Service Unavailable'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type:
- string
- 'null'
examples:
- null
message:
type: string
examples:
- 'Service Unavailable'
examples:
-
-
field: null
message: 'Service Unavailable'
meta:
type: object
properties:
request_id:
type: string
examples:
- 1670e81f-0fee-45e8-9a49-ae2afa5ee569
timestamp:
type: string
examples:
- '2026-08-21T05:14:35.689876Z'
examples:
-
status: ERROR
message: 'Service Unavailable'
data: null
errors:
-
field: null
message: 'Service Unavailable'
meta:
request_id: 1670e81f-0fee-45e8-9a49-ae2afa5ee569
timestamp: '2026-08-21T05:14:35.689876Z'
tags:
- 'Admin API'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
status:
type: string
description: ''
enum:
- pending
- processing
- ready
- failed
- expired
examples:
- expired
user_id:
type: string
description: 'Must be a valid UUID.'
examples:
- 6ff8f7f6-1eb3-3525-be4a-3932c805afed
/api/v1/admin/auth/change-password:
post:
summary: 'Change Admin Password'
operationId: changeAdminPassword
description: 'Allows an authenticated, 2FA-verified admin to change their own password.'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Password updated.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- d2eb3161-d050-4812-80a5-90564e5b4161
timestamp:
type: string
examples:
- '2026-08-05T16:18:41.650210Z'
examples:
-
status: SUCCESS
message: 'Password updated.'
data: null
errors: null
meta:
request_id: d2eb3161-d050-4812-80a5-90564e5b4161
timestamp: '2026-08-05T16:18:41.650210Z'
422:
description: ''
content:
application/json:
schema:
oneOf:
-
description: 'Validation Error'
type: object
properties:
status:
type: string
examples:
- VALIDATION_ERROR
message:
type: string
examples:
- 'The given data was invalid.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type: string
examples:
- current_password
message:
type: string
examples:
- 'The password is incorrect.'
examples:
-
-
field: current_password
message: 'The password is incorrect.'
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-04-02T12:00:00.000000Z'
examples:
-
status: VALIDATION_ERROR
message: 'The given data was invalid.'
data: null
errors:
-
field: current_password
message: 'The password is incorrect.'
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-04-02T12:00:00.000000Z'
-
description: 'Password Reuse'
type: object
properties:
status:
type: string
examples:
- VALIDATION_ERROR
message:
type: string
examples:
- 'The given data was invalid.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type: string
examples:
- password
message:
type: string
examples:
- 'You cannot reuse your last 3 passwords.'
examples:
-
-
field: password
message: 'You cannot reuse your last 3 passwords.'
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-04-02T12:00:00.000000Z'
examples:
-
status: VALIDATION_ERROR
message: 'The given data was invalid.'
data: null
errors:
-
field: password
message: 'You cannot reuse your last 3 passwords.'
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-04-02T12:00:00.000000Z'
tags:
- 'Admin API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
current_password:
type: string
description: ''
examples:
- S3cure-Passw0rd!
new_password:
type: string
description: ''
examples:
- S3cure-Passw0rd!
required:
- current_password
- new_password
/api/v1/admin/auth/me:
get:
summary: 'Get Current Admin'
operationId: getCurrentAdmin
description: "Returns the authenticated admin's profile alongside their resolved ACL\nmanifest (scope, presets, flat permission list, conditional markers)."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- Success
data:
type: object
properties:
profile:
type: object
properties:
id:
type: string
examples:
- 019fd2b7-edab-7280-b09f-b18f58a272ee
name:
type: string
examples:
- 'Super Admin'
email:
type: string
examples:
- office@flexxr.at
role:
type: string
examples:
- super_admin
is_active:
type: boolean
examples:
- true
acl:
type: object
properties:
scope:
type: string
examples:
- admin
presets:
type: array
items:
type: string
examples:
-
- super-admin
permissions:
type: array
items:
type: string
examples:
-
- admin.admins.create
- admin.admins.deactivate
- admin.admins.reactivate
- admin.admins.reset-2fa
- admin.admins.update
- admin.admins.update-presets
- admin.admins.update-role
- admin.admins.view
- admin.app-settings.reveal-secret
- admin.app-settings.update
- admin.app-settings.view
- admin.assignments.manage
- admin.assignments.view
- admin.audit.view
- admin.billing.update
- admin.billing.view
- admin.compliance.aueg-monitor
- admin.compliance.minimum-wage-warnings
- admin.compliance.view
- admin.compliance.working-time-warnings
- admin.contracts.manage
- admin.contracts.view
- admin.employees.approve
- admin.employees.flag-high-risk
- admin.employees.reactivate
- admin.employees.reject
- admin.employees.request-correction
- admin.employees.review-documents
- admin.employees.suspend
- admin.employees.validate-svs
- admin.employees.view
- admin.finance.manage-dunning
- admin.finance.manage-invoices
- admin.finance.view-invoices
- admin.finance.view-payments
- admin.gdpr.anonymize
- admin.gdpr.export
- admin.gdpr.restrict
- admin.jobs.approve
- admin.jobs.emergency-close
- admin.jobs.emergency-reassign
- admin.jobs.manage-categories
- admin.jobs.manage-document-types
- admin.jobs.reject
- admin.jobs.view
- admin.legal.manage
- admin.legal.view
- admin.organizations.reactivate
- admin.organizations.reject
- admin.organizations.reset-password
- admin.organizations.review-documents
- admin.organizations.suspend
- admin.organizations.update
- admin.organizations.verify
- admin.organizations.view
- admin.payroll.download-payslips
- admin.payroll.sync
- admin.payroll.trigger
- admin.payroll.view
- admin.ratings.moderate
- admin.ratings.view
- admin.reports.export
- admin.reports.view
- admin.security.detect-duplicates
- admin.security.manual-review
- admin.support.assign-tickets
- admin.support.escalate-tickets
- admin.support.resolve-tickets
- admin.support.update
- admin.support.view
- admin.support.view-tickets
- admin.system.view-health
- admin.system.view-metrics
- admin.users.change-status
- admin.users.reset-password
- admin.users.update
- admin.users.update-by-admin
- admin.users.view
conditional:
type: object
properties: { }
computed_at:
type: string
examples:
- '2026-08-05T16:18:41+00:00'
two_factor:
type: object
properties:
confirmed:
type: boolean
examples:
- true
required:
type: boolean
examples:
- false
setup_required:
type: boolean
examples:
- false
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- bbcf7f74-310a-47c7-9394-09d385e741df
timestamp:
type: string
examples:
- '2026-08-05T16:18:41.662797Z'
examples:
-
status: SUCCESS
message: Success
data:
profile:
id: 019fd2b7-edab-7280-b09f-b18f58a272ee
name: 'Super Admin'
email: office@flexxr.at
role: super_admin
is_active: true
acl:
scope: admin
presets:
- super-admin
permissions:
- admin.admins.create
- admin.admins.deactivate
- admin.admins.reactivate
- admin.admins.reset-2fa
- admin.admins.update
- admin.admins.update-presets
- admin.admins.update-role
- admin.admins.view
- admin.app-settings.reveal-secret
- admin.app-settings.update
- admin.app-settings.view
- admin.assignments.manage
- admin.assignments.view
- admin.audit.view
- admin.billing.update
- admin.billing.view
- admin.compliance.aueg-monitor
- admin.compliance.minimum-wage-warnings
- admin.compliance.view
- admin.compliance.working-time-warnings
- admin.contracts.manage
- admin.contracts.view
- admin.employees.approve
- admin.employees.flag-high-risk
- admin.employees.reactivate
- admin.employees.reject
- admin.employees.request-correction
- admin.employees.review-documents
- admin.employees.suspend
- admin.employees.validate-svs
- admin.employees.view
- admin.finance.manage-dunning
- admin.finance.manage-invoices
- admin.finance.view-invoices
- admin.finance.view-payments
- admin.gdpr.anonymize
- admin.gdpr.export
- admin.gdpr.restrict
- admin.jobs.approve
- admin.jobs.emergency-close
- admin.jobs.emergency-reassign
- admin.jobs.manage-categories
- admin.jobs.manage-document-types
- admin.jobs.reject
- admin.jobs.view
- admin.legal.manage
- admin.legal.view
- admin.organizations.reactivate
- admin.organizations.reject
- admin.organizations.reset-password
- admin.organizations.review-documents
- admin.organizations.suspend
- admin.organizations.update
- admin.organizations.verify
- admin.organizations.view
- admin.payroll.download-payslips
- admin.payroll.sync
- admin.payroll.trigger
- admin.payroll.view
- admin.ratings.moderate
- admin.ratings.view
- admin.reports.export
- admin.reports.view
- admin.security.detect-duplicates
- admin.security.manual-review
- admin.support.assign-tickets
- admin.support.escalate-tickets
- admin.support.resolve-tickets
- admin.support.update
- admin.support.view
- admin.support.view-tickets
- admin.system.view-health
- admin.system.view-metrics
- admin.users.change-status
- admin.users.reset-password
- admin.users.update
- admin.users.update-by-admin
- admin.users.view
conditional: { }
computed_at: '2026-08-05T16:18:41+00:00'
two_factor:
confirmed: true
required: false
setup_required: false
errors: null
meta:
request_id: bbcf7f74-310a-47c7-9394-09d385e741df
timestamp: '2026-08-05T16:18:41.662797Z'
tags:
- 'Admin API'
/api/v1/admin/auth/two-factor:
get:
summary: 'Get Admin Two-Factor State'
operationId: getAdminTwoFactorState
description: 'Returns the current 2FA configuration for the authenticated admin.'
parameters: []
responses:
200:
description: '2FA Disabled'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- Success
data:
type: object
properties:
enabled:
type: boolean
examples:
- false
method:
type:
- string
- 'null'
examples:
- null
confirmed_at:
type:
- string
- 'null'
examples:
- null
recovery_codes_remaining:
type: integer
examples:
- 0
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-06-10T12:00:00.000000Z'
examples:
-
status: SUCCESS
message: Success
data:
enabled: false
method: null
confirmed_at: null
recovery_codes_remaining: 0
errors: null
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-06-10T12:00:00.000000Z'
tags:
- 'Admin API'
'/api/v1/admin/users/{user_id}/sessions':
get:
summary: "List a user's active Sanctum sessions (personal access tokens)."
operationId: listAUsersActiveSanctumSessionspersonalAccessTokens
description: ''
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Sessions retrieved successfully.'
data:
type: array
items:
type: object
properties:
id:
type: string
examples:
- '4'
name:
type: string
examples:
- docs
abilities:
type: array
items:
type: string
examples:
-
- '*'
last_used_at:
type:
- string
- 'null'
examples:
- null
expires_at:
type:
- string
- 'null'
examples:
- null
created_at:
type: string
examples:
- '2026-08-05T16:18:33.000000Z'
is_expired:
type: boolean
examples:
- false
examples:
-
-
id: '4'
name: docs
abilities:
- '*'
last_used_at: null
expires_at: null
created_at: '2026-08-05T16:18:33.000000Z'
is_expired: false
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 0c9f5eef-9166-4173-9389-17d6cc662596
timestamp:
type: string
examples:
- '2026-08-05T16:18:41.792412Z'
examples:
-
status: SUCCESS
message: 'Sessions retrieved successfully.'
data:
-
id: '4'
name: docs
abilities:
- '*'
last_used_at: null
expires_at: null
created_at: '2026-08-05T16:18:33.000000Z'
is_expired: false
errors: null
meta:
request_id: 0c9f5eef-9166-4173-9389-17d6cc662596
timestamp: '2026-08-05T16:18:41.792412Z'
tags:
- 'Admin API'
delete:
summary: "Revoke ALL Sanctum sessions for a user. Used by admins responding to\nsuspected account compromise or following a privacy support request."
operationId: revokeALLSanctumSessionsForAUserUsedByAdminsRespondingToSuspectedAccountCompromiseOrFollowingAPrivacySupportRequest
description: ''
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'All sessions revoked.'
data:
type: object
properties:
revoked_count:
type: integer
examples:
- 1
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 0ab9f276-3175-4f5e-88f2-017b0affb509
timestamp:
type: string
examples:
- '2026-08-05T16:18:41.808950Z'
examples:
-
status: SUCCESS
message: 'All sessions revoked.'
data:
revoked_count: 1
errors: null
meta:
request_id: 0ab9f276-3175-4f5e-88f2-017b0affb509
timestamp: '2026-08-05T16:18:41.808950Z'
tags:
- 'Admin API'
parameters:
-
in: path
name: user_id
description: 'The ID of the user.'
required: true
schema:
type: string
examples:
- 019f0593-c75f-7265-bb3d-278a77f5a95f
'/api/v1/admin/users/{user_id}/sessions/{tokenId}':
delete:
summary: 'Revoke a single Sanctum session (personal access token) belonging to a user.'
operationId: revokeASingleSanctumSessionpersonalAccessTokenBelongingToAUser
description: ''
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Session revoked.'
data:
type: object
properties:
id:
type: string
examples:
- '4'
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- a50d1a40-7b5b-4de9-865c-d54b38b6fc2e
timestamp:
type: string
examples:
- '2026-08-05T16:18:41.826845Z'
examples:
-
status: SUCCESS
message: 'Session revoked.'
data:
id: '4'
errors: null
meta:
request_id: a50d1a40-7b5b-4de9-865c-d54b38b6fc2e
timestamp: '2026-08-05T16:18:41.826845Z'
tags:
- 'Admin API'
parameters:
-
in: path
name: user_id
description: 'The ID of the user.'
required: true
schema:
type: string
examples:
- 019f0593-c75f-7265-bb3d-278a77f5a95f
-
in: path
name: tokenId
description: ''
required: true
schema:
type: string
examples:
- architecto
'/api/v1/admin/employees/{profileId}/suspend':
post:
summary: 'Suspend an ACTIVE employee.'
operationId: suspendAnACTIVEEmployee
description: "Suspend Employee\n\nSuspension immediately cancels all future scheduled shifts so the\nsuspended worker can neither appear on rosters nor accrue wages while\nrestricted. The employee keeps login access but sees a restriction\nnotice; the generic reason category is shared, investigation details\nare not.\n\nAfter the transaction commits, each affected organisation receives a\nsingle ShiftCancelled notification (one per org, deduplicated). A\nnotification failure never aborts the suspension."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Employee suspended.'
data:
type: object
properties:
employee_id:
type: string
examples:
- 019fd2b7-f279-7142-a68d-0d4563a06070
status:
type: string
examples:
- suspended
cancelled_shifts:
type: integer
examples:
- 1
examples:
-
status: SUCCESS
message: 'Employee suspended.'
data:
employee_id: 019fd2b7-f279-7142-a68d-0d4563a06070
status: suspended
cancelled_shifts: 1
404:
description: 'Not Found'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- ERROR
message:
type: string
examples:
- 'Employee not found.'
examples:
-
status: ERROR
message: 'Employee not found.'
422:
description: 'Not Active'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- ERROR
message:
type: string
examples:
- 'Only active employees can be suspended.'
examples:
-
status: ERROR
message: 'Only active employees can be suspended.'
tags:
- 'Admin API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
reason:
type: string
description: 'Generic reason category shared with the employee.'
examples:
- compliance_violation
required:
- reason
parameters:
-
in: path
name: profileId
description: ''
required: true
schema:
type: string
examples:
- architecto
'/api/v1/admin/employees/{profileId}/reactivate':
post:
summary: 'Reactivate a SUSPENDED employee.'
operationId: reactivateASUSPENDEDEmployee
description: 'Reactivate Employee'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Employee reactivated.'
data:
type: object
properties:
employee_id:
type: string
examples:
- 019fd2b8-29d8-7088-aaea-ffda7ed96710
status:
type: string
examples:
- active
examples:
-
status: SUCCESS
message: 'Employee reactivated.'
data:
employee_id: 019fd2b8-29d8-7088-aaea-ffda7ed96710
status: active
404:
description: 'Not Found'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- ERROR
message:
type: string
examples:
- 'Employee not found.'
examples:
-
status: ERROR
message: 'Employee not found.'
422:
description: 'Not Suspended'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- ERROR
message:
type: string
examples:
- 'Only suspended employees can be reactivated.'
examples:
-
status: ERROR
message: 'Only suspended employees can be reactivated.'
tags:
- 'Admin API'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
note:
type: string
description: 'optional Internal note recorded in the audit trail.'
examples:
- 'Investigation closed, no violation found.'
parameters:
-
in: path
name: profileId
description: ''
required: true
schema:
type: string
examples:
- architecto
'/api/v1/admin/employees/discrepancies/{discrepancyId}/resolve':
post:
summary: 'Resolve a document discrepancy after admin review.'
operationId: resolveADocumentDiscrepancyAfterAdminReview
description: "Discrepancies are advisory flags created by OCR when extracted data\ndoesn't match the profile (name, DOB, IBAN). Admins can resolve them\nafter verifying the document is legitimate."
parameters: []
responses:
200:
description: Success
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Discrepancy resolved.'
data:
type: object
properties:
discrepancy_id:
type: string
examples:
- uuid
resolved_at:
type: string
examples:
- '2026-06-20 12:00'
examples:
-
status: SUCCESS
message: 'Discrepancy resolved.'
data:
discrepancy_id: uuid
resolved_at: '2026-06-20 12:00'
404:
description: 'Not Found'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- NOT_FOUND
message:
type: string
examples:
- 'Discrepancy not found.'
examples:
-
status: NOT_FOUND
message: 'Discrepancy not found.'
422:
description: 'Already Resolved'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- INVALID_OPERATION
message:
type: string
examples:
- 'Discrepancy already resolved.'
examples:
-
status: INVALID_OPERATION
message: 'Discrepancy already resolved.'
tags:
- 'Admin API'
parameters:
-
in: path
name: discrepancyId
description: ''
required: true
schema:
type: string
examples:
- architecto
/api/v1/admin/no-shows:
get:
summary: 'List No-Shows'
operationId: listNoShows
description: "Platform-wide list of no-show incidents, with reliability/fraud\nrelevant summary counts computed across every filtered row, not\njust the current page."
parameters:
-
in: query
name: organization_id
description: 'Filter by organisation.'
required: false
schema:
type: string
description: 'Filter by organisation.'
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
-
in: query
name: date_from
description: 'Filter by start date (YYYY-MM-DD).'
required: false
schema:
type: string
description: 'Filter by start date (YYYY-MM-DD).'
examples:
- '2026-01-01'
-
in: query
name: date_to
description: 'Filter by end date (YYYY-MM-DD).'
required: false
schema:
type: string
description: 'Filter by end date (YYYY-MM-DD).'
examples:
- '2026-01-31'
-
in: query
name: status
description: 'Filter by status.'
required: false
schema:
type: string
description: 'Filter by status.'
examples:
- detected
-
in: query
name: is_excused
description: 'Filter by excused status.'
required: false
schema:
type: boolean
description: 'Filter by excused status.'
examples:
- false
responses:
503:
description: ''
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- ERROR
message:
type: string
examples:
- 'Service Unavailable'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type:
- string
- 'null'
examples:
- null
message:
type: string
examples:
- 'Service Unavailable'
examples:
-
-
field: null
message: 'Service Unavailable'
meta:
type: object
properties:
request_id:
type: string
examples:
- 4dd51c7f-725f-4721-9e34-00899c8d6bd6
timestamp:
type: string
examples:
- '2026-08-21T05:14:35.839287Z'
examples:
-
status: ERROR
message: 'Service Unavailable'
data: null
errors:
-
field: null
message: 'Service Unavailable'
meta:
request_id: 4dd51c7f-725f-4721-9e34-00899c8d6bd6
timestamp: '2026-08-21T05:14:35.839287Z'
tags:
- 'Admin API'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
organization_id:
type: string
description: 'Must be a valid UUID.'
examples:
- 6ff8f7f6-1eb3-3525-be4a-3932c805afed
date_from:
type: string
description: 'Must be a valid date.'
examples:
- '2026-08-21T05:14:35'
date_to:
type: string
description: 'Must be a valid date.'
examples:
- '2026-08-21T05:14:35'
status:
type: string
description: ''
enum:
- pending
- detected
- confirmed
- replacement_requested
- replacement_assigned
- resolved
- excused
- disputed
examples:
- excused
is_excused:
type: boolean
description: ''
examples:
- false
'/api/v1/admin/no-shows/{incident_id}/excuse':
post:
summary: 'Excuse No-Show'
operationId: excuseNoShow
description: "Marks a no-show incident as excused with an optional note. Refused\nwhen the incident is already excused or is past the stage where an\nexcuse still applies."
parameters: []
responses:
409:
description: 'Cannot be excused'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- CONFLICT
message:
type: string
examples:
- 'This incident can no longer be excused.'
examples:
-
status: CONFLICT
message: 'This incident can no longer be excused.'
tags:
- 'Admin API'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
note:
type:
- string
- 'null'
description: ''
examples:
- 'Employee provided a medical certificate.'
parameters:
-
in: path
name: incident_id
description: 'The ID of the incident.'
required: true
schema:
type: string
examples:
- 019f34c2-b7a3-7144-96fa-ba76afffcf1e
-
in: path
name: incident
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
/api/v1/admin/badges:
get:
summary: 'List Badges'
operationId: listBadges
description: "The full badge catalog (including hidden/inactive), with the number\nof workers who have earned each badge."
parameters: []
responses:
503:
description: ''
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- ERROR
message:
type: string
examples:
- 'Service Unavailable'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type:
- string
- 'null'
examples:
- null
message:
type: string
examples:
- 'Service Unavailable'
examples:
-
-
field: null
message: 'Service Unavailable'
meta:
type: object
properties:
request_id:
type: string
examples:
- 5b167a2f-b8ad-43a0-8c3c-562d7aaf84e8
timestamp:
type: string
examples:
- '2026-08-21T05:14:35.857334Z'
examples:
-
status: ERROR
message: 'Service Unavailable'
data: null
errors:
-
field: null
message: 'Service Unavailable'
meta:
request_id: 5b167a2f-b8ad-43a0-8c3c-562d7aaf84e8
timestamp: '2026-08-21T05:14:35.857334Z'
tags:
- 'Admin API'
post:
summary: 'Create Badge'
operationId: createBadge
description: 'Adds a new badge to the catalog.'
parameters: []
responses: { }
tags:
- 'Admin API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
slug:
type: string
description: 'Unique catalog key.'
examples:
- perfect-month
name:
type: string
description: ''
examples:
- 'Perfekter Monat'
description:
type:
- string
- 'null'
description: ''
examples:
- 'Keine Ausfälle einen Monat lang.'
icon:
type:
- string
- 'null'
description: ''
examples:
- mdi-star
color:
type:
- string
- 'null'
description: ''
examples:
- gold
category:
type: string
description: 'One of performance, reliability, milestone, special.'
examples:
- reliability
tier:
type: integer
description: '1=bronze, 2=silver, 3=gold.'
examples:
- 2
criteria_type:
type:
- string
- 'null'
description: 'One of shifts_completed, rating_average, reliability_score, consecutive_shifts, total_hours_worked, on_time_arrivals, five_star_ratings, different_venues, weekend_shifts, holiday_shifts.'
examples:
- shifts_completed
criteria_threshold:
type:
- integer
- 'null'
description: ''
examples:
- 10
points:
type:
- integer
- 'null'
description: ''
examples:
- 50
is_active:
type: boolean
description: ''
examples:
- true
is_hidden:
type: boolean
description: ''
examples:
- false
sort_order:
type:
- integer
- 'null'
description: ''
examples:
- 10
required:
- slug
- name
- category
- tier
'/api/v1/admin/badges/{badge_id}':
put:
summary: 'Update Badge'
operationId: updateBadge
description: "Updates a catalog badge's definition."
parameters: []
responses: { }
tags:
- 'Admin API'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: ''
examples:
- 'Perfekter Monat'
description:
type:
- string
- 'null'
description: ''
examples:
- 'Keine Ausfälle einen Monat lang.'
icon:
type:
- string
- 'null'
description: ''
examples:
- mdi-star
color:
type:
- string
- 'null'
description: ''
examples:
- gold
category:
type: string
description: 'One of performance, reliability, milestone, special.'
examples:
- reliability
tier:
type: integer
description: '1=bronze, 2=silver, 3=gold.'
examples:
- 2
criteria_type:
type:
- string
- 'null'
description: ''
examples:
- shifts_completed
criteria_threshold:
type:
- integer
- 'null'
description: ''
examples:
- 10
points:
type: integer
description: ''
examples:
- 50
is_active:
type: boolean
description: ''
examples:
- true
is_hidden:
type: boolean
description: ''
examples:
- false
sort_order:
type: integer
description: ''
examples:
- 10
delete:
summary: 'Delete Badge'
operationId: deleteBadge
description: 'Soft-deletes a catalog badge. Existing awards are unaffected.'
parameters: []
responses: { }
tags:
- 'Admin API'
parameters:
-
in: path
name: badge_id
description: 'The ID of the badge.'
required: true
schema:
type: string
examples:
- 019fe42b-65dc-722e-a4c6-9768028255ff
-
in: path
name: badge
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
'/api/v1/admin/badges/{badge_id}/award':
post:
summary: 'Award Badge'
operationId: awardBadge
description: 'Manually awards a badge to a worker with a reason.'
parameters: []
responses:
409:
description: 'Already awarded'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- DUPLICATE_ENTRY
message:
type: string
examples:
- 'This worker already has this badge.'
examples:
-
status: DUPLICATE_ENTRY
message: 'This worker already has this badge.'
tags:
- 'Admin API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
user_id:
type: string
description: ''
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
reason:
type: string
description: ''
examples:
- 'Herausragende Leistung im Juni.'
required:
- user_id
- reason
parameters:
-
in: path
name: badge_id
description: 'The ID of the badge.'
required: true
schema:
type: string
examples:
- 019fe42b-65dc-722e-a4c6-9768028255ff
-
in: path
name: badge
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
'/api/v1/admin/badges/{badge_id}/awards/{user}':
delete:
summary: 'Revoke Badge Award'
operationId: revokeBadgeAward
description: 'Revokes a badge from the worker who was awarded it.'
parameters: []
responses:
404:
description: 'Not awarded'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- NOT_FOUND
message:
type: string
examples:
- 'This worker does not have this badge.'
examples:
-
status: NOT_FOUND
message: 'This worker does not have this badge.'
tags:
- 'Admin API'
parameters:
-
in: path
name: badge_id
description: 'The ID of the badge.'
required: true
schema:
type: string
examples:
- 019fe42b-65dc-722e-a4c6-9768028255ff
-
in: path
name: user
description: "The worker's user id."
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
-
in: path
name: badge
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
/api/v1/admin/job-categories:
get:
summary: 'List Job Categories'
operationId: listJobCategories
description: 'Returns all job categories with optional filtering.'
parameters:
-
in: query
name: active
description: 'Filter by active status.'
required: false
schema:
type: boolean
description: 'Filter by active status.'
examples:
- true
-
in: query
name: featured
description: 'Filter featured categories.'
required: false
schema:
type: boolean
description: 'Filter featured categories.'
examples:
- true
-
in: query
name: parent_id
description: 'Filter by parent category.'
required: false
schema:
type: string
description: 'Filter by parent category.'
examples:
- 'null (for root categories)'
-
in: query
name: search
description: 'Search by name or slug.'
required: false
schema:
type: string
description: 'Search by name or slug.'
examples:
- gastro
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
categories:
type: array
items:
type: object
properties:
id:
type: string
examples:
- 019fd2b7-f371-732c-8cdb-6de13be42891
slug:
type: string
examples:
- gastro
name:
type: string
examples:
- Gastronomie
name_localized:
type: string
examples:
- Gastronomy
icon:
type: string
examples:
- utensils
kollektivvertrag:
type: string
examples:
- Gastgewerbe
color:
type:
- string
- 'null'
examples:
- null
is_featured:
type: boolean
examples:
- true
parent_id:
type:
- string
- 'null'
examples:
- null
children:
type: array
examples:
- []
examples:
-
-
id: 019fd2b7-f371-732c-8cdb-6de13be42891
slug: gastro
name: Gastronomie
name_localized: Gastronomy
icon: utensils
kollektivvertrag: Gastgewerbe
color: null
is_featured: true
parent_id: null
children: []
examples:
-
status: SUCCESS
data:
categories:
-
id: 019fd2b7-f371-732c-8cdb-6de13be42891
slug: gastro
name: Gastronomie
name_localized: Gastronomy
icon: utensils
kollektivvertrag: Gastgewerbe
color: null
is_featured: true
parent_id: null
children: []
tags:
- 'Admin API'
post:
summary: 'Create Job Category'
operationId: createJobCategory
description: 'Creates a new job category for the platform.'
parameters: []
responses:
201:
description: Success
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
category:
type: object
properties: { }
examples:
-
status: SUCCESS
data:
category: { }
422:
description: 'Validation Error'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- ERROR
message:
type: string
examples:
- 'Validation failed'
examples:
-
status: ERROR
message: 'Validation failed'
tags:
- 'Admin API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: 'Category name (German).'
examples:
- Gastronomie
name_en:
type:
- string
- 'null'
description: 'Category name (English).'
examples:
- Gastronomy
slug:
type:
- string
- 'null'
description: 'URL slug. Auto-generated if not provided.'
examples:
- gastro
icon:
type:
- string
- 'null'
description: 'Icon name.'
examples:
- utensils
description:
type:
- string
- 'null'
description: 'Category description.'
examples:
- 'Restaurant and hotel jobs'
kollektivvertrag:
type:
- string
- 'null'
description: 'KV reference for Austria.'
examples:
- 'Gastgewerbe KV'
parent_id:
type:
- string
- 'null'
description: 'Parent category ID for hierarchical structure.'
examples:
- null
sort_order:
type:
- integer
- 'null'
description: 'Display order.'
examples:
- 10
is_active:
type: boolean
description: 'Whether category is active.'
examples:
- true
is_featured:
type: boolean
description: 'Featured on mobile filter.'
examples:
- false
color:
type:
- string
- 'null'
description: 'Hex color for UI.'
examples:
- '#FF5733'
required:
- name
'/api/v1/admin/job-categories/{category}':
put:
summary: 'Update Job Category'
operationId: updateJobCategory
description: 'Updates an existing job category.'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
category:
type: object
properties:
id:
type: string
examples:
- 019fd2b7-f371-732c-8cdb-6de13be42891
slug:
type: string
examples:
- gastro
name:
type: string
examples:
- Gastronomie
name_localized:
type: string
examples:
- Gastronomy
icon:
type: string
examples:
- utensils
kollektivvertrag:
type: string
examples:
- 'Gastgewerbe KV'
color:
type: string
examples:
- '#FF5733'
is_featured:
type: boolean
examples:
- false
parent_id:
type:
- string
- 'null'
examples:
- null
examples:
-
status: SUCCESS
data:
category:
id: 019fd2b7-f371-732c-8cdb-6de13be42891
slug: gastro
name: Gastronomie
name_localized: Gastronomy
icon: utensils
kollektivvertrag: 'Gastgewerbe KV'
color: '#FF5733'
is_featured: false
parent_id: null
404:
description: 'Not Found'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- ERROR
message:
type: string
examples:
- 'Category not found'
examples:
-
status: ERROR
message: 'Category not found'
422:
description: 'Validation Error'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- ERROR
message:
type: string
examples:
- 'Validation failed'
examples:
-
status: ERROR
message: 'Validation failed'
tags:
- 'Admin API'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: 'Category name (German).'
examples:
- Gastronomie
name_en:
type:
- string
- 'null'
description: 'Category name (English).'
examples:
- Gastronomy
slug:
type: string
description: 'URL slug.'
examples:
- gastro
icon:
type:
- string
- 'null'
description: 'Icon name.'
examples:
- utensils
description:
type:
- string
- 'null'
description: 'Category description.'
examples:
- 'Restaurant and hotel jobs'
kollektivvertrag:
type:
- string
- 'null'
description: 'KV reference.'
examples:
- 'Gastgewerbe KV'
parent_id:
type:
- string
- 'null'
description: 'Parent category ID.'
examples:
- null
sort_order:
type:
- integer
- 'null'
description: 'Display order.'
examples:
- 10
is_active:
type: boolean
description: 'Whether category is active.'
examples:
- true
is_featured:
type: boolean
description: 'Featured on mobile.'
examples:
- false
color:
type:
- string
- 'null'
description: 'Hex color.'
examples:
- '#FF5733'
delete:
summary: 'Delete Job Category'
operationId: deleteJobCategory
description: 'Soft-deletes a job category. Categories with active jobs cannot be deleted.'
parameters:
-
in: query
name: force
description: 'Force delete even with jobs (moves jobs to uncategorized).'
required: false
schema:
type: boolean
description: 'Force delete even with jobs (moves jobs to uncategorized).'
examples:
- false
responses:
200:
description: Success
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Category deleted'
examples:
-
status: SUCCESS
message: 'Category deleted'
404:
description: 'Not Found'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- ERROR
message:
type: string
examples:
- 'Category not found'
examples:
-
status: ERROR
message: 'Category not found'
409:
description: Conflict
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- ERROR
message:
type: string
examples:
- 'Category has active jobs'
examples:
-
status: ERROR
message: 'Category has active jobs'
tags:
- 'Admin API'
parameters:
-
in: path
name: category
description: 'The category ID.'
required: true
schema:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
/api/v1/admin/job-document-types:
get:
summary: 'List Job Document Types'
operationId: listJobDocumentTypes
description: "List every system document type with its company-visibility flag so an admin\ncan choose which the companies may require when authoring a job."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
document_types:
type: array
items:
type: object
properties:
id:
type: string
examples:
- d10619da-fd23-4dab-bcd1-73f8b2387be5
code:
type: string
examples:
- passport
label:
type: string
examples:
- Passport
company_selectable:
type: boolean
examples:
- true
sort_order:
type: integer
examples:
- 10
examples:
-
-
id: d10619da-fd23-4dab-bcd1-73f8b2387be5
code: passport
label: Passport
company_selectable: true
sort_order: 10
-
id: 9ee56a86-9282-45b4-b735-f218aae16759
code: id_card
label: 'ID card'
company_selectable: true
sort_order: 20
-
id: f5348f1b-2f15-4c41-a5fe-b2f99c775ee2
code: driver_license
label: "Driver's licence"
company_selectable: true
sort_order: 30
-
id: 7d395af4-f896-46df-bbc4-671ae40f4f8a
code: work_permit
label: 'Work permit'
company_selectable: true
sort_order: 40
-
id: 84af4d09-035f-43e6-bd53-2ab18370338a
code: residence_permit
label: 'Residence permit'
company_selectable: true
sort_order: 50
-
id: 2f3704b2-e39a-4eeb-8864-56bf52f3ed28
code: rot_weiss_rot_karte
label: 'Rot-Weiß-Rot card'
company_selectable: true
sort_order: 60
-
id: 9f171c88-d0da-4d68-ba57-87402c4a0a2c
code: blue_card
label: 'EU Blue Card'
company_selectable: true
sort_order: 70
-
id: bedbfb30-1731-4887-9a3e-b01d77eb0577
code: bank_statement
label: 'Bank statement'
company_selectable: true
sort_order: 80
-
id: 45eff414-51e3-4c74-9f12-5b7b600ea715
code: proof_of_address
label: 'Proof of address'
company_selectable: true
sort_order: 90
-
id: 7da8605b-3108-41b7-ae37-57b6fba26ef5
code: social_insurance_card
label: 'Social insurance record'
company_selectable: true
sort_order: 100
-
id: 004dcced-7dc0-41b5-86dc-ebe2d5098fe2
code: tax_document
label: 'Tax document'
company_selectable: true
sort_order: 110
-
id: 88d1719e-fd3f-47f7-bfe9-418db3353b6a
code: certification
label: Certification
company_selectable: true
sort_order: 120
-
id: 9c528cb6-5ed6-418d-85ee-98d5087c90cf
code: health_certificate
label: 'Health certificate'
company_selectable: true
sort_order: 130
-
id: 04ebe252-d4c3-40e2-b4e4-ee8a9f636d1b
code: criminal_record_check
label: 'Criminal record check'
company_selectable: true
sort_order: 140
-
id: fe6ae84f-7733-49c9-a8de-20672765d2bf
code: other
label: Other
company_selectable: true
sort_order: 150
examples:
-
status: SUCCESS
data:
document_types:
-
id: d10619da-fd23-4dab-bcd1-73f8b2387be5
code: passport
label: Passport
company_selectable: true
sort_order: 10
-
id: 9ee56a86-9282-45b4-b735-f218aae16759
code: id_card
label: 'ID card'
company_selectable: true
sort_order: 20
-
id: f5348f1b-2f15-4c41-a5fe-b2f99c775ee2
code: driver_license
label: "Driver's licence"
company_selectable: true
sort_order: 30
-
id: 7d395af4-f896-46df-bbc4-671ae40f4f8a
code: work_permit
label: 'Work permit'
company_selectable: true
sort_order: 40
-
id: 84af4d09-035f-43e6-bd53-2ab18370338a
code: residence_permit
label: 'Residence permit'
company_selectable: true
sort_order: 50
-
id: 2f3704b2-e39a-4eeb-8864-56bf52f3ed28
code: rot_weiss_rot_karte
label: 'Rot-Weiß-Rot card'
company_selectable: true
sort_order: 60
-
id: 9f171c88-d0da-4d68-ba57-87402c4a0a2c
code: blue_card
label: 'EU Blue Card'
company_selectable: true
sort_order: 70
-
id: bedbfb30-1731-4887-9a3e-b01d77eb0577
code: bank_statement
label: 'Bank statement'
company_selectable: true
sort_order: 80
-
id: 45eff414-51e3-4c74-9f12-5b7b600ea715
code: proof_of_address
label: 'Proof of address'
company_selectable: true
sort_order: 90
-
id: 7da8605b-3108-41b7-ae37-57b6fba26ef5
code: social_insurance_card
label: 'Social insurance record'
company_selectable: true
sort_order: 100
-
id: 004dcced-7dc0-41b5-86dc-ebe2d5098fe2
code: tax_document
label: 'Tax document'
company_selectable: true
sort_order: 110
-
id: 88d1719e-fd3f-47f7-bfe9-418db3353b6a
code: certification
label: Certification
company_selectable: true
sort_order: 120
-
id: 9c528cb6-5ed6-418d-85ee-98d5087c90cf
code: health_certificate
label: 'Health certificate'
company_selectable: true
sort_order: 130
-
id: 04ebe252-d4c3-40e2-b4e4-ee8a9f636d1b
code: criminal_record_check
label: 'Criminal record check'
company_selectable: true
sort_order: 140
-
id: fe6ae84f-7733-49c9-a8de-20672765d2bf
code: other
label: Other
company_selectable: true
sort_order: 150
tags:
- 'Admin API'
'/api/v1/admin/job-document-types/{documentType}':
put:
summary: 'Update Job Document Type'
operationId: updateJobDocumentType
description: "Toggle whether companies may pick a document type (and its ordering). The set\nof types is fixed by the system enum, so only visibility and order are\neditable — not the code or creation of new types."
parameters: []
responses: { }
tags:
- 'Admin API'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
company_selectable:
type: boolean
description: ''
examples:
- true
sort_order:
type: integer
description: ''
examples:
- 1
parameters:
-
in: path
name: documentType
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
/api/v1/admin/contracts:
get:
summary: 'List Contracts'
operationId: listContracts
description: "Paginated, platform-wide list of contracts, filterable by type,\nstatus, organisation, worker, or contract number."
parameters:
-
in: query
name: type
description: 'Filter by type: rahmenvertrag|ueberlassungsvertrag|dienstvertrag.'
required: false
schema:
type: string
description: 'Filter by type: rahmenvertrag|ueberlassungsvertrag|dienstvertrag.'
examples:
- ueberlassungsvertrag
-
in: query
name: status
description: 'Filter by status: draft|pending_signature|signed|active|completed|revoked|expired.'
required: false
schema:
type: string
description: 'Filter by status: draft|pending_signature|signed|active|completed|revoked|expired.'
examples:
- signed
-
in: query
name: organization_id
description: 'Filter by organisation.'
required: false
schema:
type: string
description: 'Filter by organisation.'
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
-
in: query
name: user_id
description: 'Filter by worker.'
required: false
schema:
type: string
description: 'Filter by worker.'
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
-
in: query
name: contract_number
description: 'Search by contract number.'
required: false
schema:
type: string
description: 'Search by contract number.'
examples:
- UEV-2026-000123
-
in: query
name: per_page
description: 'Items per page (max 50).'
required: false
schema:
type: integer
description: 'Items per page (max 50).'
examples:
- 20
responses:
503:
description: ''
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- ERROR
message:
type: string
examples:
- 'Service Unavailable'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type:
- string
- 'null'
examples:
- null
message:
type: string
examples:
- 'Service Unavailable'
examples:
-
-
field: null
message: 'Service Unavailable'
meta:
type: object
properties:
request_id:
type: string
examples:
- f605c85b-dbfe-4bd5-a2d9-3e642710bcbd
timestamp:
type: string
examples:
- '2026-08-21T05:14:36.264377Z'
examples:
-
status: ERROR
message: 'Service Unavailable'
data: null
errors:
-
field: null
message: 'Service Unavailable'
meta:
request_id: f605c85b-dbfe-4bd5-a2d9-3e642710bcbd
timestamp: '2026-08-21T05:14:36.264377Z'
tags:
- 'Admin API'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
type:
type: string
description: ''
enum:
- rahmenvertrag
- ueberlassungsvertrag
- dienstvertrag
examples:
- ueberlassungsvertrag
status:
type: string
description: ''
enum:
- draft
- pending_signature
- signed
- active
- completed
- revoked
- expired
examples:
- signed
organization_id:
type: string
description: 'Must be a valid UUID.'
examples:
- 6ff8f7f6-1eb3-3525-be4a-3932c805afed
user_id:
type: string
description: 'Must be a valid UUID.'
examples:
- 6b72fe4a-5b40-307c-bc24-f79acf9a1bb9
contract_number:
type: string
description: 'Must not be greater than 50 characters.'
examples:
- m
'/api/v1/admin/contracts/{contract_id}':
get:
summary: 'Show Contract'
operationId: showContract
description: "Contract detail including the signed shift assignments it covers and\na null-safe download URL."
parameters: []
responses:
503:
description: ''
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- ERROR
message:
type: string
examples:
- 'Service Unavailable'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type:
- string
- 'null'
examples:
- null
message:
type: string
examples:
- 'Service Unavailable'
examples:
-
-
field: null
message: 'Service Unavailable'
meta:
type: object
properties:
request_id:
type: string
examples:
- 6b72b314-73fd-45bb-ae86-1dbcd3058f40
timestamp:
type: string
examples:
- '2026-08-21T05:14:36.276577Z'
examples:
-
status: ERROR
message: 'Service Unavailable'
data: null
errors:
-
field: null
message: 'Service Unavailable'
meta:
request_id: 6b72b314-73fd-45bb-ae86-1dbcd3058f40
timestamp: '2026-08-21T05:14:36.276577Z'
tags:
- 'Admin API'
parameters:
-
in: path
name: contract_id
description: 'The ID of the contract.'
required: true
schema:
type: string
examples:
- 019fdbed-1326-732f-8e9c-68bd4a59d120
-
in: path
name: contract
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
/api/v1/admin/messages/conversations:
get:
summary: 'List Conversations'
operationId: listConversations
description: "Paginated, platform-wide list of conversations, optionally filtered\nby organisation, user, or a free-text search against the subject."
parameters:
-
in: query
name: organization_id
description: 'Filter by organisation.'
required: false
schema:
type: string
description: 'Filter by organisation.'
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
-
in: query
name: user_id
description: 'Filter by employee.'
required: false
schema:
type: string
description: 'Filter by employee.'
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
-
in: query
name: q
description: 'Free-text search against the conversation subject.'
required: false
schema:
type: string
description: 'Free-text search against the conversation subject.'
examples:
- Schicht
-
in: query
name: per_page
description: 'Items per page (max 50).'
required: false
schema:
type: integer
description: 'Items per page (max 50).'
examples:
- 20
responses:
503:
description: ''
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- ERROR
message:
type: string
examples:
- 'Service Unavailable'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type:
- string
- 'null'
examples:
- null
message:
type: string
examples:
- 'Service Unavailable'
examples:
-
-
field: null
message: 'Service Unavailable'
meta:
type: object
properties:
request_id:
type: string
examples:
- 312f42e4-0d24-4b77-b40b-c08cbc8cb1e2
timestamp:
type: string
examples:
- '2026-08-21T05:14:36.300932Z'
examples:
-
status: ERROR
message: 'Service Unavailable'
data: null
errors:
-
field: null
message: 'Service Unavailable'
meta:
request_id: 312f42e4-0d24-4b77-b40b-c08cbc8cb1e2
timestamp: '2026-08-21T05:14:36.300932Z'
tags:
- 'Admin API'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
organization_id:
type: string
description: 'Must be a valid UUID.'
examples:
- 6ff8f7f6-1eb3-3525-be4a-3932c805afed
user_id:
type: string
description: 'Must be a valid UUID.'
examples:
- 6b72fe4a-5b40-307c-bc24-f79acf9a1bb9
q:
type: string
description: 'Must not be greater than 255 characters.'
examples:
- m
'/api/v1/admin/messages/conversations/{conversation_id}':
get:
summary: 'Show Conversation Thread'
operationId: showConversationThread
description: "Paginated, read-only message history for a conversation. Sender\nnames are resolved via bulk join queries rather than per-message\nlookups."
parameters:
-
in: query
name: per_page
description: 'Items per page (max 50).'
required: false
schema:
type: integer
description: 'Items per page (max 50).'
examples:
- 50
-
in: query
name: before
description: 'Only messages sent before this ISO8601 timestamp.'
required: false
schema:
type: string
description: 'Only messages sent before this ISO8601 timestamp.'
examples:
- '2026-06-01T00:00:00Z'
responses:
503:
description: ''
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- ERROR
message:
type: string
examples:
- 'Service Unavailable'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type:
- string
- 'null'
examples:
- null
message:
type: string
examples:
- 'Service Unavailable'
examples:
-
-
field: null
message: 'Service Unavailable'
meta:
type: object
properties:
request_id:
type: string
examples:
- db671b12-e2fc-457e-b129-8de92ac9460f
timestamp:
type: string
examples:
- '2026-08-21T05:14:36.315491Z'
examples:
-
status: ERROR
message: 'Service Unavailable'
data: null
errors:
-
field: null
message: 'Service Unavailable'
meta:
request_id: db671b12-e2fc-457e-b129-8de92ac9460f
timestamp: '2026-08-21T05:14:36.315491Z'
tags:
- 'Admin API'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
per_page:
type: integer
description: 'Must be at least 1. Must not be greater than 50.'
examples:
- 1
before:
type: string
description: 'Must be a valid date.'
examples:
- '2026-08-21T05:14:36'
parameters:
-
in: path
name: conversation_id
description: 'The ID of the conversation.'
required: true
schema:
type: string
examples:
- 019fd51d-53c7-73d0-880d-8edee1800329
-
in: path
name: conversation
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
/api/v1/admin/system/health:
get:
summary: 'Get System Health'
operationId: getSystemHealth
description: "Latest result per health check and the overall derived status\n(healthy, degraded, or unhealthy)."
parameters: []
responses:
503:
description: ''
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- ERROR
message:
type: string
examples:
- 'Service Unavailable'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type:
- string
- 'null'
examples:
- null
message:
type: string
examples:
- 'Service Unavailable'
examples:
-
-
field: null
message: 'Service Unavailable'
meta:
type: object
properties:
request_id:
type: string
examples:
- d067ae32-0f50-4752-8381-87f0a057109e
timestamp:
type: string
examples:
- '2026-08-21T05:14:36.361872Z'
examples:
-
status: ERROR
message: 'Service Unavailable'
data: null
errors:
-
field: null
message: 'Service Unavailable'
meta:
request_id: d067ae32-0f50-4752-8381-87f0a057109e
timestamp: '2026-08-21T05:14:36.361872Z'
tags:
- 'Admin API'
'/api/v1/admin/fraud/cases/{case_id}':
get:
summary: 'Show Fraud Case'
operationId: showFraudCase
description: "Full detail of a fraud case: the entities involved, the evidence the\nsignal collected, and its review history."
parameters: []
responses:
503:
description: ''
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- ERROR
message:
type: string
examples:
- 'Service Unavailable'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type:
- string
- 'null'
examples:
- null
message:
type: string
examples:
- 'Service Unavailable'
examples:
-
-
field: null
message: 'Service Unavailable'
meta:
type: object
properties:
request_id:
type: string
examples:
- bd6c8605-e0fc-4a2c-9735-10a25d924945
timestamp:
type: string
examples:
- '2026-08-21T05:14:36.378810Z'
examples:
-
status: ERROR
message: 'Service Unavailable'
data: null
errors:
-
field: null
message: 'Service Unavailable'
meta:
request_id: bd6c8605-e0fc-4a2c-9735-10a25d924945
timestamp: '2026-08-21T05:14:36.378810Z'
tags:
- 'Admin API'
parameters:
-
in: path
name: case_id
description: 'The ID of the case.'
required: true
schema:
type: string
examples:
- 019ffe44-1675-717e-a552-4f410e68ac0f
-
in: path
name: case
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
'/api/v1/admin/fraud/cases/{case_id}/status':
post:
summary: 'Update Fraud Case Status'
operationId: updateFraudCaseStatus
description: "Move a fraud case into review, confirm it, or dismiss it with\nresolution notes. A dismissed case is left untouched by the nightly\n`fraud:evaluate` sweep until a reviewer reopens it."
parameters: []
responses:
422:
description: 'Invalid status'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- VALIDATION_ERROR
message:
type: string
examples:
- 'The status field is invalid.'
examples:
-
status: VALIDATION_ERROR
message: 'The status field is invalid.'
tags:
- 'Admin API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
status:
type: string
description: 'One of reviewing, confirmed, dismissed.'
examples:
- confirmed
resolution_notes:
type:
- string
- 'null'
description: ''
examples:
- 'Confirmed — same person operating two accounts.'
required:
- status
parameters:
-
in: path
name: case_id
description: 'The ID of the case.'
required: true
schema:
type: string
examples:
- 019ffe44-1675-717e-a552-4f410e68ac0f
-
in: path
name: case
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
'/api/v1/admin/fraud/rules/{rule_id}':
put:
summary: 'Update Fraud Rule'
operationId: updateFraudRule
description: "Enable/disable a fraud signal or update its threshold/window config.\nThe signal key and severity are fixed at the code level and cannot be\nchanged here."
parameters: []
responses: { }
tags:
- 'Admin API'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
is_active:
type: boolean
description: ''
examples:
- true
config:
type: object
description: 'Signal-specific thresholds/windows.'
properties: { }
examples:
-
min_shared_users: 3
parameters:
-
in: path
name: rule_id
description: 'The ID of the rule.'
required: true
schema:
type: string
examples:
- 019fe183-5843-7311-9ead-2251ec85b3f1
-
in: path
name: rule
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
/api/v1/admin/admins/export:
get:
summary: 'Export Admins'
operationId: exportAdmins
description: 'Streams the full admin roster as a CSV file.'
parameters: []
responses:
503:
description: ''
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- ERROR
message:
type: string
examples:
- 'Service Unavailable'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type:
- string
- 'null'
examples:
- null
message:
type: string
examples:
- 'Service Unavailable'
examples:
-
-
field: null
message: 'Service Unavailable'
meta:
type: object
properties:
request_id:
type: string
examples:
- faad9a42-9a68-459c-b2a7-61c6d335c075
timestamp:
type: string
examples:
- '2026-08-21T05:14:36.475427Z'
examples:
-
status: ERROR
message: 'Service Unavailable'
data: null
errors:
-
field: null
message: 'Service Unavailable'
meta:
request_id: faad9a42-9a68-459c-b2a7-61c6d335c075
timestamp: '2026-08-21T05:14:36.475427Z'
tags:
- 'Admin API'
/api/v1/admin/invoices:
get:
summary: 'List Invoices'
operationId: listInvoices
description: 'List invoices with filtering and pagination.'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
invoices:
type: array
items:
type: object
properties:
id:
type: string
examples:
- 3257a732-8d8a-4de5-8dee-a54e85c7e111
invoice_number:
type: string
examples:
- RE-2026-055747
organization:
type: object
properties:
id:
type: string
examples:
- 019fd2b7-f072-7154-8961-5b324cc6c46c
name:
type: string
examples:
- Caritas
period:
type: string
examples:
- 2026-08
status:
type: string
examples:
- draft
status_label:
type: string
examples:
- Draft
subtotal_cents:
type: integer
examples:
- 55952
vat_amount_cents:
type: integer
examples:
- 11190
total_cents:
type: integer
examples:
- 67142
vat_rate_percent:
type: integer
examples:
- 20
line_items_count:
type: integer
examples:
- 0
invoice_date:
type: string
examples:
- '2026-08-05'
due_date:
type: string
examples:
- '2026-08-19'
paid_at:
type:
- string
- 'null'
examples:
- null
created_at:
type: string
examples:
- '2026-08-05T16:18:32+00:00'
examples:
-
-
id: 3257a732-8d8a-4de5-8dee-a54e85c7e111
invoice_number: RE-2026-055747
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
period: 2026-08
status: draft
status_label: Draft
subtotal_cents: 55952
vat_amount_cents: 11190
total_cents: 67142
vat_rate_percent: 20
line_items_count: 0
invoice_date: '2026-08-05'
due_date: '2026-08-19'
paid_at: null
created_at: '2026-08-05T16:18:32+00:00'
pagination:
type: object
properties:
current_page:
type: integer
examples:
- 1
last_page:
type: integer
examples:
- 1
per_page:
type: integer
examples:
- 20
total:
type: integer
examples:
- 1
examples:
-
status: SUCCESS
data:
invoices:
-
id: 3257a732-8d8a-4de5-8dee-a54e85c7e111
invoice_number: RE-2026-055747
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
period: 2026-08
status: draft
status_label: Draft
subtotal_cents: 55952
vat_amount_cents: 11190
total_cents: 67142
vat_rate_percent: 20
line_items_count: 0
invoice_date: '2026-08-05'
due_date: '2026-08-19'
paid_at: null
created_at: '2026-08-05T16:18:32+00:00'
pagination:
current_page: 1
last_page: 1
per_page: 20
total: 1
tags:
- 'Admin API'
'/api/v1/admin/invoices/{invoice_id}':
get:
summary: 'Show Invoice'
operationId: showInvoice
description: 'Show detailed invoice information for an admin, across any organisation.'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
invoice:
type: object
properties:
id:
type: string
examples:
- 3257a732-8d8a-4de5-8dee-a54e85c7e111
invoice_number:
type: string
examples:
- RE-2026-055747
organization:
type: object
properties:
id:
type: string
examples:
- 019fd2b7-f072-7154-8961-5b324cc6c46c
name:
type: string
examples:
- Caritas
period:
type: string
examples:
- 2026-08
status:
type: string
examples:
- draft
status_label:
type: string
examples:
- Draft
reference:
type:
- string
- 'null'
examples:
- null
notes:
type:
- string
- 'null'
examples:
- null
summary:
type: object
properties:
subtotal_cents:
type: integer
examples:
- 55952
vat_rate_percent:
type: integer
examples:
- 20
vat_amount_cents:
type: integer
examples:
- 11190
platform_fee_cents:
type: integer
examples:
- 0
total_cents:
type: integer
examples:
- 67142
paid_amount_cents:
type: integer
examples:
- 0
remaining_cents:
type: integer
examples:
- 67142
dates:
type: object
properties:
invoice_date:
type: string
examples:
- '2026-08-05'
due_date:
type: string
examples:
- '2026-08-19'
sent_at:
type:
- string
- 'null'
examples:
- null
paid_at:
type:
- string
- 'null'
examples:
- null
payment_reference:
type:
- string
- 'null'
examples:
- null
pdf_path:
type:
- string
- 'null'
examples:
- null
line_items:
type: array
examples:
- []
created_at:
type: string
examples:
- '2026-08-05T16:18:32+00:00'
updated_at:
type: string
examples:
- '2026-08-05T16:18:32+00:00'
examples:
-
status: SUCCESS
data:
invoice:
id: 3257a732-8d8a-4de5-8dee-a54e85c7e111
invoice_number: RE-2026-055747
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
period: 2026-08
status: draft
status_label: Draft
reference: null
notes: null
summary:
subtotal_cents: 55952
vat_rate_percent: 20
vat_amount_cents: 11190
platform_fee_cents: 0
total_cents: 67142
paid_amount_cents: 0
remaining_cents: 67142
dates:
invoice_date: '2026-08-05'
due_date: '2026-08-19'
sent_at: null
paid_at: null
payment_reference: null
pdf_path: null
line_items: []
created_at: '2026-08-05T16:18:32+00:00'
updated_at: '2026-08-05T16:18:32+00:00'
tags:
- 'Admin API'
parameters:
-
in: path
name: invoice_id
description: 'The ID of the invoice.'
required: true
schema:
type: string
examples:
- 019f1bd5-82b2-7341-abb8-e8f08fd445c3
-
in: path
name: invoice
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
/api/v1/admin/wallet/withdrawals:
get:
summary: "GET /admin/wallet/withdrawals — every company's withdrawal requests, newest\nfirst, so admins can find the ones awaiting review instead of relying on\neach company's own history endpoint. Optional `?status=` filter."
operationId: gETadminwalletwithdrawalsEveryCompanysWithdrawalRequestsNewestFirstSoAdminsCanFindTheOnesAwaitingReviewInsteadOfRelyingOnEachCompanysOwnHistoryEndpointOptionalstatusFilter
description: ''
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
withdrawals:
type: array
examples:
- []
pagination:
type: object
properties:
current_page:
type: integer
examples:
- 1
last_page:
type: integer
examples:
- 1
per_page:
type: integer
examples:
- 20
total:
type: integer
examples:
- 0
examples:
-
status: SUCCESS
data:
withdrawals: []
pagination:
current_page: 1
last_page: 1
per_page: 20
total: 0
tags:
- 'Admin API'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
status:
type: string
description: ''
examples:
- architecto
'/api/v1/admin/wallet/withdrawals/{withdrawal}/approve':
post:
summary: "POST /admin/wallet/withdrawals/{withdrawal}/approve — approve a pending,\nover-threshold withdrawal and run the card refund."
operationId: pOSTadminwalletwithdrawalswithdrawalapproveApproveAPendingOverThresholdWithdrawalAndRunTheCardRefund
description: ''
parameters: []
responses: { }
tags:
- 'Admin API'
parameters:
-
in: path
name: withdrawal
description: 'The withdrawal.'
required: true
schema:
type: string
examples:
- architecto
'/api/v1/admin/wallet/withdrawals/{withdrawal}/reject':
post:
summary: "POST /admin/wallet/withdrawals/{withdrawal}/reject — reject a pending\nwithdrawal and release its reserved funds back to the company."
operationId: pOSTadminwalletwithdrawalswithdrawalrejectRejectAPendingWithdrawalAndReleaseItsReservedFundsBackToTheCompany
description: ''
parameters: []
responses: { }
tags:
- 'Admin API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
reason:
type: string
description: ''
examples:
- 'Krankheitsbedingt kurzfristig abgesagt.'
required:
- reason
parameters:
-
in: path
name: withdrawal
description: 'The withdrawal.'
required: true
schema:
type: string
examples:
- architecto
/api/v1/admin/assignments:
get:
summary: 'List Assignments'
operationId: listAssignments
description: "Every assignment across all organisations, for operations oversight — the\nplatform-wide view of who is working where, which the per-company endpoint\ncannot give because it is scoped to one organisation.\n\nUnfiltered this spans the whole history, newest first, since the rows an\noperator acts on are the ones nearest to now."
parameters:
-
in: query
name: status
description: 'Filter by assignment status. Allowed: awaiting_signature, signed, checked_in, completed, hours_confirmed, no_show, cancelled, disputed, expired.'
required: false
schema:
type: string
description: 'Filter by assignment status. Allowed: awaiting_signature, signed, checked_in, completed, hours_confirmed, no_show, cancelled, disputed, expired.'
examples:
- checked_in
-
in: query
name: organization_id
description: 'Restrict to one organisation.'
required: false
schema:
type: string
description: 'Restrict to one organisation.'
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
-
in: query
name: date_from
description: 'Earliest shift date (YYYY-MM-DD).'
required: false
schema:
type: string
description: 'Earliest shift date (YYYY-MM-DD).'
examples:
- '2026-07-01'
-
in: query
name: date_to
description: 'Latest shift date (YYYY-MM-DD).'
required: false
schema:
type: string
description: 'Latest shift date (YYYY-MM-DD).'
examples:
- '2026-07-31'
-
in: query
name: search
description: 'Match on worker name or job title.'
required: false
schema:
type: string
description: 'Match on worker name or job title.'
examples:
- Brunner
-
in: query
name: per_page
description: 'Items per page (max 100).'
required: false
schema:
type: integer
description: 'Items per page (max 100).'
examples:
- 25
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
assignments:
type: array
examples:
- []
pagination:
type: object
properties:
current_page:
type: integer
examples:
- 1
last_page:
type: integer
examples:
- 1
per_page:
type: integer
examples:
- 16
total:
type: integer
examples:
- 0
examples:
-
status: SUCCESS
data:
assignments: []
pagination:
current_page: 1
last_page: 1
per_page: 16
total: 0
tags:
- 'Admin API'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
status:
type:
- string
- 'null'
description: ''
enum:
- awaiting_signature
- signed
- checked_in
- completed
- hours_confirmed
- no_show
- cancelled
- disputed
- expired
examples:
- hours_confirmed
organization_id:
type:
- string
- 'null'
description: 'Must be a valid UUID.'
examples:
- 6ff8f7f6-1eb3-3525-be4a-3932c805afed
date_from:
type:
- string
- 'null'
description: 'Must be a valid date.'
examples:
- '2026-08-21T05:14:36'
date_to:
type:
- string
- 'null'
description: 'Must be a valid date.'
examples:
- '2026-08-21T05:14:36'
search:
type:
- string
- 'null'
description: 'Must not be greater than 100 characters.'
examples:
- g
per_page:
type:
- integer
- 'null'
description: 'Must be at least 1. Must not be greater than 100.'
examples:
- 16
/api/v1/admin/ratings:
get:
summary: 'List Ratings'
operationId: listRatings
description: "Ratings exchanged between companies and workers, newest first, for\nmoderation oversight.\n\nAnonymity is a promise made to the rater in the apps, not a rule for this\nendpoint: moderation is impossible without knowing who wrote what, so the\nidentities are returned here and the obligation moves to who may call it."
parameters:
-
in: query
name: min_score
description: 'Only ratings at or below this overall score, for finding complaints.'
required: false
schema:
type: integer
description: 'Only ratings at or below this overall score, for finding complaints.'
examples:
- 2
-
in: query
name: has_comment
description: 'Only ratings carrying free text.'
required: false
schema:
type: boolean
description: 'Only ratings carrying free text.'
examples:
- true
-
in: query
name: per_page
description: 'Items per page (max 100).'
required: false
schema:
type: integer
description: 'Items per page (max 100).'
examples:
- 25
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
ratings:
type: array
examples:
- []
pagination:
type: object
properties:
current_page:
type: integer
examples:
- 1
last_page:
type: integer
examples:
- 1
per_page:
type: integer
examples:
- 22
total:
type: integer
examples:
- 0
examples:
-
status: SUCCESS
data:
ratings: []
pagination:
current_page: 1
last_page: 1
per_page: 22
total: 0
tags:
- 'Admin API'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
min_score:
type:
- integer
- 'null'
description: 'Must be at least 1. Must not be greater than 5.'
examples:
- 1
has_comment:
type:
- boolean
- 'null'
description: ''
examples:
- false
per_page:
type:
- integer
- 'null'
description: 'Must be at least 1. Must not be greater than 100.'
examples:
- 22
'/api/v1/admin/shift-requests/{shiftRequest_id}/decide':
post:
summary: 'Decide a Shift Request (Admin Override)'
operationId: decideAShiftRequestAdminOverride
description: "Approve or decline a worker's shift request on behalf of the company —\nused when a company is unresponsive or a decision needs correcting."
parameters: []
responses:
409:
description: 'Already decided'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- INVALID_OPERATION
message:
type: string
examples:
- 'This request has already been decided.'
examples:
-
status: INVALID_OPERATION
message: 'This request has already been decided.'
tags:
- 'Admin API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
approve:
type: boolean
description: 'Whether the request is granted.'
examples:
- true
note:
type:
- string
- 'null'
description: 'The reason. Required when declining.'
examples:
- 'Overtime was not authorised on site.'
required:
- approve
parameters:
-
in: path
name: shiftRequest_id
description: 'The ID of the shiftRequest.'
required: true
schema:
type: string
examples:
- 019fdd1b-c901-7051-b2ed-3a96150483ed
-
in: path
name: shiftRequest
description: 'The request being decided.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
/api/v1/admin/compliance/violations:
get:
summary: 'List Compliance Violations'
operationId: listComplianceViolations
description: 'List compliance violations with filtering.'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
violations:
type: array
examples:
- []
summary:
type: object
properties:
total_unresolved:
type: integer
examples:
- 0
critical_unresolved:
type: integer
examples:
- 0
pagination:
type: object
properties:
current_page:
type: integer
examples:
- 1
last_page:
type: integer
examples:
- 1
per_page:
type: integer
examples:
- 20
total:
type: integer
examples:
- 0
examples:
-
status: SUCCESS
data:
violations: []
summary:
total_unresolved: 0
critical_unresolved: 0
pagination:
current_page: 1
last_page: 1
per_page: 20
total: 0
tags:
- 'Admin API'
'/api/v1/admin/compliance/violations/{violation_id}/resolve':
post:
summary: 'Resolve Compliance Violation'
operationId: resolveComplianceViolation
description: 'Resolve a compliance violation.'
parameters: []
responses: { }
tags:
- 'Admin API'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
notes:
type:
- string
- 'null'
description: ''
examples:
- Beispieltext
parameters:
-
in: path
name: violation_id
description: 'The ID of the violation.'
required: true
schema:
type: string
examples:
- architecto
-
in: path
name: violation
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
/api/v1/admin/compliance/reports:
post:
summary: 'Generate Compliance Report'
operationId: generateComplianceReport
description: 'Generate compliance report for a period.'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
report:
type: object
properties:
period:
type: object
properties:
from:
type: string
examples:
- '2026-09-30'
to:
type: string
examples:
- '2026-09-30'
total_violations:
type: integer
examples:
- 0
resolved:
type: integer
examples:
- 0
unresolved:
type: integer
examples:
- 0
by_severity:
type: array
examples:
- []
by_type:
type: array
examples:
- []
compliance_score:
type: integer
examples:
- 100
examples:
-
status: SUCCESS
data:
report:
period:
from: '2026-09-30'
to: '2026-09-30'
total_violations: 0
resolved: 0
unresolved: 0
by_severity: []
by_type: []
compliance_score: 100
tags:
- 'Admin API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
organization_id:
type: string
description: ''
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
from:
type: date
description: ''
examples:
- '2026-09-30'
to:
type: date
description: ''
examples:
- '2026-09-30'
required:
- organization_id
- from
- to
/api/v1/admin/compliance/fallweise-flags:
get:
summary: 'List Fallweise Flags'
operationId: listFallweiseFlags
description: "List fallweise-Beschäftigung Ampel flags (yellow/red engagements) with\nfiltering — the audit trail proving casual employment is monitored for\nregularity (Beschäftigungskonzept §3)."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
flags:
type: array
examples:
- []
summary:
type: object
properties:
yellow:
type: integer
examples:
- 0
red:
type: integer
examples:
- 0
pagination:
type: object
properties:
current_page:
type: integer
examples:
- 1
last_page:
type: integer
examples:
- 1
per_page:
type: integer
examples:
- 20
total:
type: integer
examples:
- 0
examples:
-
status: SUCCESS
data:
flags: []
summary:
yellow: 0
red: 0
pagination:
current_page: 1
last_page: 1
per_page: 20
total: 0
tags:
- 'Admin API'
/api/v1/admin/reports/summary:
get:
summary: 'Get Reports Summary'
operationId: getReportsSummary
description: "Platform-wide KPI groups — assignments, hours, money, growth,\ncompliance, ratings — for a date range. Defaults to the current\ncalendar month."
parameters:
-
in: query
name: date_from
description: 'optional Start of the report period (YYYY-MM-DD). Defaults to first day of current month.'
required: false
schema:
type: string
description: 'optional Start of the report period (YYYY-MM-DD). Defaults to first day of current month.'
examples:
- '2026-05-01'
-
in: query
name: date_to
description: 'optional End of the report period (YYYY-MM-DD). Defaults to last day of current month.'
required: false
schema:
type: string
description: 'optional End of the report period (YYYY-MM-DD). Defaults to last day of current month.'
examples:
- '2026-05-31'
responses:
503:
description: ''
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- ERROR
message:
type: string
examples:
- 'Service Unavailable'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type:
- string
- 'null'
examples:
- null
message:
type: string
examples:
- 'Service Unavailable'
examples:
-
-
field: null
message: 'Service Unavailable'
meta:
type: object
properties:
request_id:
type: string
examples:
- 2ef084b4-a17b-462a-8e18-7786504d90af
timestamp:
type: string
examples:
- '2026-08-21T05:14:36.739104Z'
examples:
-
status: ERROR
message: 'Service Unavailable'
data: null
errors:
-
field: null
message: 'Service Unavailable'
meta:
request_id: 2ef084b4-a17b-462a-8e18-7786504d90af
timestamp: '2026-08-21T05:14:36.739104Z'
tags:
- 'Admin API'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
date_from:
type: string
description: 'Must be a valid date.'
examples:
- '2026-08-21T05:14:36'
date_to:
type: string
description: 'Must be a valid date.'
examples:
- '2026-08-21T05:14:36'
/api/v1/admin/reports/series:
get:
summary: 'Get Reports Series'
operationId: getReportsSeries
description: "Weekly time-series of completed assignments, top-up volume, new\nworkers, and compliance violations for a date range. Defaults to the\ncurrent calendar month."
parameters:
-
in: query
name: date_from
description: 'optional Start of the report period (YYYY-MM-DD). Defaults to first day of current month.'
required: false
schema:
type: string
description: 'optional Start of the report period (YYYY-MM-DD). Defaults to first day of current month.'
examples:
- '2026-05-01'
-
in: query
name: date_to
description: 'optional End of the report period (YYYY-MM-DD). Defaults to last day of current month.'
required: false
schema:
type: string
description: 'optional End of the report period (YYYY-MM-DD). Defaults to last day of current month.'
examples:
- '2026-05-31'
responses:
503:
description: ''
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- ERROR
message:
type: string
examples:
- 'Service Unavailable'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type:
- string
- 'null'
examples:
- null
message:
type: string
examples:
- 'Service Unavailable'
examples:
-
-
field: null
message: 'Service Unavailable'
meta:
type: object
properties:
request_id:
type: string
examples:
- 9d489aaf-a4e2-4696-a234-1eca78e8cb4f
timestamp:
type: string
examples:
- '2026-08-21T05:14:36.753892Z'
examples:
-
status: ERROR
message: 'Service Unavailable'
data: null
errors:
-
field: null
message: 'Service Unavailable'
meta:
request_id: 9d489aaf-a4e2-4696-a234-1eca78e8cb4f
timestamp: '2026-08-21T05:14:36.753892Z'
tags:
- 'Admin API'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
date_from:
type: string
description: 'Must be a valid date.'
examples:
- '2026-08-21T05:14:36'
date_to:
type: string
description: 'Must be a valid date.'
examples:
- '2026-08-21T05:14:36'
/api/v1/admin/reports/export:
get:
summary: 'Export Reports'
operationId: exportReports
description: "Streams one reports section — assignments, money, growth, or\ncompliance — as a CSV download for the given date range."
parameters:
-
in: query
name: section
description: 'Section to export: assignments, money, growth, or compliance.'
required: true
schema:
type: string
description: 'Section to export: assignments, money, growth, or compliance.'
examples:
- assignments
-
in: query
name: date_from
description: 'optional Start of the report period (YYYY-MM-DD). Defaults to first day of current month.'
required: false
schema:
type: string
description: 'optional Start of the report period (YYYY-MM-DD). Defaults to first day of current month.'
examples:
- '2026-05-01'
-
in: query
name: date_to
description: 'optional End of the report period (YYYY-MM-DD). Defaults to last day of current month.'
required: false
schema:
type: string
description: 'optional End of the report period (YYYY-MM-DD). Defaults to last day of current month.'
examples:
- '2026-05-31'
responses:
503:
description: ''
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- ERROR
message:
type: string
examples:
- 'Service Unavailable'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type:
- string
- 'null'
examples:
- null
message:
type: string
examples:
- 'Service Unavailable'
examples:
-
-
field: null
message: 'Service Unavailable'
meta:
type: object
properties:
request_id:
type: string
examples:
- 9cd044c7-a95b-4c30-994a-cd26f220e034
timestamp:
type: string
examples:
- '2026-08-21T05:14:36.768364Z'
examples:
-
status: ERROR
message: 'Service Unavailable'
data: null
errors:
-
field: null
message: 'Service Unavailable'
meta:
request_id: 9cd044c7-a95b-4c30-994a-cd26f220e034
timestamp: '2026-08-21T05:14:36.768364Z'
tags:
- 'Admin API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
section:
type: string
description: ''
examples:
- architecto
date_from:
type: string
description: 'Must be a valid date.'
examples:
- '2026-08-21T05:14:36'
date_to:
type: string
description: 'Must be a valid date.'
examples:
- '2026-08-21T05:14:36'
required:
- section
/api/v1/admin/legal/documents:
get:
summary: 'List Legal Document Versions'
operationId: listLegalDocumentVersions
description: 'List legal document versions (terms, privacy/Datenschutz, AÜG info, …).'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: array
items:
type: object
properties:
id:
type: string
examples:
- 019fd2b7-ef68-7312-a1a3-6b14820cf9e2
document_type:
type: string
examples:
- privacy_policy
document_label:
type: string
examples:
- 'Privacy Policy'
version:
type: integer
examples:
- 1
locale:
type: string
examples:
- de
title:
type: string
examples:
- Datenschutzerklärung
public_url:
type:
- string
- 'null'
examples:
- null
requires_reacceptance:
type: boolean
examples:
- true
is_active:
type: boolean
examples:
- true
requires_consent:
type: boolean
examples:
- true
accepted_count:
type: integer
examples:
- 1
pending_count:
type: integer
examples:
- 15
published_at:
type: string
examples:
- '2026-08-05T16:18:17+00:00'
created_at:
type: string
examples:
- '2026-08-05T16:18:17+00:00'
examples:
-
-
id: 019fd2b7-ef68-7312-a1a3-6b14820cf9e2
document_type: privacy_policy
document_label: 'Privacy Policy'
version: 1
locale: de
title: Datenschutzerklärung
public_url: null
requires_reacceptance: true
is_active: true
requires_consent: true
accepted_count: 1
pending_count: 15
published_at: '2026-08-05T16:18:17+00:00'
created_at: '2026-08-05T16:18:17+00:00'
-
id: 019fd2b7-ef6c-7272-a1a7-6eebcd113ec1
document_type: privacy_policy
document_label: 'Privacy Policy'
version: 1
locale: en
title: 'Privacy Policy'
public_url: null
requires_reacceptance: true
is_active: true
requires_consent: true
accepted_count: 0
pending_count: 16
published_at: '2026-08-05T16:18:17+00:00'
created_at: '2026-08-05T16:18:17+00:00'
-
id: 019fd2b7-ef6f-72ae-8c86-d9977da26ec0
document_type: terms_of_service
document_label: 'Terms and Conditions'
version: 1
locale: de
title: 'Allgemeine Geschäftsbedingungen (AGB)'
public_url: null
requires_reacceptance: true
is_active: true
requires_consent: true
accepted_count: 1
pending_count: 15
published_at: '2026-08-05T16:18:17+00:00'
created_at: '2026-08-05T16:18:17+00:00'
-
id: 019fd2b7-ef73-7323-9eea-ef440b63f842
document_type: terms_of_service
document_label: 'Terms and Conditions'
version: 1
locale: en
title: 'Terms of Service'
public_url: null
requires_reacceptance: true
is_active: true
requires_consent: true
accepted_count: 0
pending_count: 16
published_at: '2026-08-05T16:18:17+00:00'
created_at: '2026-08-05T16:18:17+00:00'
-
id: 019fd2b7-ef76-73b5-a9c5-d7cca778324b
document_type: data_processing
document_label: 'Data Processing'
version: 1
locale: de
title: 'Einwilligung zur Datenverarbeitung'
public_url: null
requires_reacceptance: true
is_active: true
requires_consent: true
accepted_count: 1
pending_count: 15
published_at: '2026-08-05T16:18:17+00:00'
created_at: '2026-08-05T16:18:17+00:00'
-
id: 019fd2b7-ef79-7064-b74c-069b159b28f9
document_type: data_processing
document_label: 'Data Processing'
version: 1
locale: en
title: 'Data Processing Consent'
public_url: null
requires_reacceptance: true
is_active: true
requires_consent: true
accepted_count: 0
pending_count: 16
published_at: '2026-08-05T16:18:17+00:00'
created_at: '2026-08-05T16:18:17+00:00'
-
id: 019fd2b7-ef7c-732a-b29e-ef789f899c9d
document_type: aug_info
document_label: 'Temporary Employment Contract (AÜG)'
version: 1
locale: de
title: 'Information gemäß AÜG (Arbeitskräfteüberlassungsgesetz)'
public_url: null
requires_reacceptance: false
is_active: true
requires_consent: false
accepted_count: 0
pending_count: 0
published_at: '2026-08-05T16:18:17+00:00'
created_at: '2026-08-05T16:18:17+00:00'
-
id: 019fd2b7-ef7f-72f2-9fb3-4a25c846761e
document_type: aug_info
document_label: 'Temporary Employment Contract (AÜG)'
version: 1
locale: en
title: 'Information pursuant to AÜG (Temporary Work Act)'
public_url: null
requires_reacceptance: false
is_active: true
requires_consent: false
accepted_count: 0
pending_count: 0
published_at: '2026-08-05T16:18:17+00:00'
created_at: '2026-08-05T16:18:17+00:00'
-
id: 019fd2b7-ef83-7298-a78c-af4b1e36b67b
document_type: svnr_consent
document_label: 'Social Security Number Consent'
version: 1
locale: de
title: 'Einwilligung zur Verarbeitung der Sozialversicherungsnummer'
public_url: null
requires_reacceptance: true
is_active: true
requires_consent: true
accepted_count: 1
pending_count: 15
published_at: '2026-08-05T16:18:17+00:00'
created_at: '2026-08-05T16:18:17+00:00'
-
id: 019fd2b7-ef86-70be-8580-5a1ac1757a9a
document_type: cookie_policy
document_label: 'Cookie Policy'
version: 1
locale: de
title: Cookie-Richtlinie
public_url: null
requires_reacceptance: false
is_active: true
requires_consent: false
accepted_count: 0
pending_count: 0
published_at: '2026-08-05T16:18:17+00:00'
created_at: '2026-08-05T16:18:17+00:00'
-
id: 019fd2b7-ef88-722e-9c3a-fa64bb1c2833
document_type: cookie_policy
document_label: 'Cookie Policy'
version: 1
locale: en
title: 'Cookie Policy'
public_url: null
requires_reacceptance: false
is_active: true
requires_consent: false
accepted_count: 0
pending_count: 0
published_at: '2026-08-05T16:18:17+00:00'
created_at: '2026-08-05T16:18:17+00:00'
-
id: 019fd2b7-ef8a-7286-ada6-84f13beb905f
document_type: imprint
document_label: Imprint
version: 1
locale: de
title: Impressum
public_url: null
requires_reacceptance: false
is_active: true
requires_consent: false
accepted_count: 0
pending_count: 0
published_at: '2026-08-05T16:18:17+00:00'
created_at: '2026-08-05T16:18:17+00:00'
-
id: 019fd2b7-ef8c-70fe-970a-72fcd401d198
document_type: imprint
document_label: Imprint
version: 1
locale: en
title: Imprint
public_url: null
requires_reacceptance: false
is_active: true
requires_consent: false
accepted_count: 0
pending_count: 0
published_at: '2026-08-05T16:18:17+00:00'
created_at: '2026-08-05T16:18:17+00:00'
examples:
-
status: SUCCESS
data:
-
id: 019fd2b7-ef68-7312-a1a3-6b14820cf9e2
document_type: privacy_policy
document_label: 'Privacy Policy'
version: 1
locale: de
title: Datenschutzerklärung
public_url: null
requires_reacceptance: true
is_active: true
requires_consent: true
accepted_count: 1
pending_count: 15
published_at: '2026-08-05T16:18:17+00:00'
created_at: '2026-08-05T16:18:17+00:00'
-
id: 019fd2b7-ef6c-7272-a1a7-6eebcd113ec1
document_type: privacy_policy
document_label: 'Privacy Policy'
version: 1
locale: en
title: 'Privacy Policy'
public_url: null
requires_reacceptance: true
is_active: true
requires_consent: true
accepted_count: 0
pending_count: 16
published_at: '2026-08-05T16:18:17+00:00'
created_at: '2026-08-05T16:18:17+00:00'
-
id: 019fd2b7-ef6f-72ae-8c86-d9977da26ec0
document_type: terms_of_service
document_label: 'Terms and Conditions'
version: 1
locale: de
title: 'Allgemeine Geschäftsbedingungen (AGB)'
public_url: null
requires_reacceptance: true
is_active: true
requires_consent: true
accepted_count: 1
pending_count: 15
published_at: '2026-08-05T16:18:17+00:00'
created_at: '2026-08-05T16:18:17+00:00'
-
id: 019fd2b7-ef73-7323-9eea-ef440b63f842
document_type: terms_of_service
document_label: 'Terms and Conditions'
version: 1
locale: en
title: 'Terms of Service'
public_url: null
requires_reacceptance: true
is_active: true
requires_consent: true
accepted_count: 0
pending_count: 16
published_at: '2026-08-05T16:18:17+00:00'
created_at: '2026-08-05T16:18:17+00:00'
-
id: 019fd2b7-ef76-73b5-a9c5-d7cca778324b
document_type: data_processing
document_label: 'Data Processing'
version: 1
locale: de
title: 'Einwilligung zur Datenverarbeitung'
public_url: null
requires_reacceptance: true
is_active: true
requires_consent: true
accepted_count: 1
pending_count: 15
published_at: '2026-08-05T16:18:17+00:00'
created_at: '2026-08-05T16:18:17+00:00'
-
id: 019fd2b7-ef79-7064-b74c-069b159b28f9
document_type: data_processing
document_label: 'Data Processing'
version: 1
locale: en
title: 'Data Processing Consent'
public_url: null
requires_reacceptance: true
is_active: true
requires_consent: true
accepted_count: 0
pending_count: 16
published_at: '2026-08-05T16:18:17+00:00'
created_at: '2026-08-05T16:18:17+00:00'
-
id: 019fd2b7-ef7c-732a-b29e-ef789f899c9d
document_type: aug_info
document_label: 'Temporary Employment Contract (AÜG)'
version: 1
locale: de
title: 'Information gemäß AÜG (Arbeitskräfteüberlassungsgesetz)'
public_url: null
requires_reacceptance: false
is_active: true
requires_consent: false
accepted_count: 0
pending_count: 0
published_at: '2026-08-05T16:18:17+00:00'
created_at: '2026-08-05T16:18:17+00:00'
-
id: 019fd2b7-ef7f-72f2-9fb3-4a25c846761e
document_type: aug_info
document_label: 'Temporary Employment Contract (AÜG)'
version: 1
locale: en
title: 'Information pursuant to AÜG (Temporary Work Act)'
public_url: null
requires_reacceptance: false
is_active: true
requires_consent: false
accepted_count: 0
pending_count: 0
published_at: '2026-08-05T16:18:17+00:00'
created_at: '2026-08-05T16:18:17+00:00'
-
id: 019fd2b7-ef83-7298-a78c-af4b1e36b67b
document_type: svnr_consent
document_label: 'Social Security Number Consent'
version: 1
locale: de
title: 'Einwilligung zur Verarbeitung der Sozialversicherungsnummer'
public_url: null
requires_reacceptance: true
is_active: true
requires_consent: true
accepted_count: 1
pending_count: 15
published_at: '2026-08-05T16:18:17+00:00'
created_at: '2026-08-05T16:18:17+00:00'
-
id: 019fd2b7-ef86-70be-8580-5a1ac1757a9a
document_type: cookie_policy
document_label: 'Cookie Policy'
version: 1
locale: de
title: Cookie-Richtlinie
public_url: null
requires_reacceptance: false
is_active: true
requires_consent: false
accepted_count: 0
pending_count: 0
published_at: '2026-08-05T16:18:17+00:00'
created_at: '2026-08-05T16:18:17+00:00'
-
id: 019fd2b7-ef88-722e-9c3a-fa64bb1c2833
document_type: cookie_policy
document_label: 'Cookie Policy'
version: 1
locale: en
title: 'Cookie Policy'
public_url: null
requires_reacceptance: false
is_active: true
requires_consent: false
accepted_count: 0
pending_count: 0
published_at: '2026-08-05T16:18:17+00:00'
created_at: '2026-08-05T16:18:17+00:00'
-
id: 019fd2b7-ef8a-7286-ada6-84f13beb905f
document_type: imprint
document_label: Imprint
version: 1
locale: de
title: Impressum
public_url: null
requires_reacceptance: false
is_active: true
requires_consent: false
accepted_count: 0
pending_count: 0
published_at: '2026-08-05T16:18:17+00:00'
created_at: '2026-08-05T16:18:17+00:00'
-
id: 019fd2b7-ef8c-70fe-970a-72fcd401d198
document_type: imprint
document_label: Imprint
version: 1
locale: en
title: Imprint
public_url: null
requires_reacceptance: false
is_active: true
requires_consent: false
accepted_count: 0
pending_count: 0
published_at: '2026-08-05T16:18:17+00:00'
created_at: '2026-08-05T16:18:17+00:00'
tags:
- 'Admin API'
post:
summary: 'Create Legal Document Version'
operationId: createLegalDocumentVersion
description: "Publish a new version of a legal document (terms, privacy/Datenschutz,\nAÜG info, …). The new version becomes active and supersedes the previous\none; the activation is recorded in the immutable audit trail."
parameters: []
responses: { }
tags:
- 'Admin API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
document_type:
type: string
description: ''
examples:
- Beispieltext
content:
type: string
description: ''
examples:
- Beispieltext
locale:
type: string
description: ''
examples:
- Beispieltext
title:
type: string
description: ''
examples:
- 'Frage zur Abrechnung'
public_url:
type:
- string
- 'null'
description: ''
examples:
- Beispieltext
requires_reacceptance:
type: boolean
description: ''
examples:
- true
required:
- document_type
- content
- title
'/api/v1/admin/legal/documents/{type}/acceptance-status':
get:
summary: 'Get Legal Document Acceptance Status'
operationId: getLegalDocumentAcceptanceStatus
description: "For a legal document type, return its current version and which active\norganisations have accepted it vs. are still pending."
parameters: []
responses:
503:
description: ''
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- ERROR
message:
type: string
examples:
- 'Service Unavailable'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type:
- string
- 'null'
examples:
- null
message:
type: string
examples:
- 'Service Unavailable'
examples:
-
-
field: null
message: 'Service Unavailable'
meta:
type: object
properties:
request_id:
type: string
examples:
- 39ffedb7-32cf-41e0-aef3-b746247e7fb1
timestamp:
type: string
examples:
- '2026-08-21T05:14:36.806720Z'
examples:
-
status: ERROR
message: 'Service Unavailable'
data: null
errors:
-
field: null
message: 'Service Unavailable'
meta:
request_id: 39ffedb7-32cf-41e0-aef3-b746247e7fb1
timestamp: '2026-08-21T05:14:36.806720Z'
tags:
- 'Admin API'
parameters:
-
in: path
name: type
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
'/api/v1/admin/legal/documents/{legalDocument_id}':
get:
summary: 'Show Legal Document Version'
operationId: showLegalDocumentVersion
description: 'Show a single legal document version, including its full content.'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
id:
type: string
examples:
- 019fd2b7-ef68-7312-a1a3-6b14820cf9e2
document_type:
type: string
examples:
- privacy_policy
version:
type: integer
examples:
- 1
locale:
type: string
examples:
- de
title:
type: string
examples:
- Datenschutzerklärung
content:
type: string
examples:
- "# Datenschutzerklärung\n\n**Stand: 05.08.2026**\n**Version: 1.0**\n\n---\n\n## 1. Verantwortlicher\n\n**Flexxer**\nMusterstraße 1\n1010 Wien, Österreich\n\n- **Firmenbuchnummer:** FN 123456x\n- **UID-Nummer:** ATU12345678\n- **Telefon:** +43 1 234 5678\n- **E-Mail:** privacy@flexxr.at\n- **Website:** https://flexxr.at\n\n### 1.1 Datenschutzbeauftragter\n\nFür Fragen zum Datenschutz erreichen Sie unseren Datenschutzbeauftragten unter:\n- **E-Mail:** dpo@flexxr.at\n\n---\n\n## 2. Rechtsgrundlagen der Verarbeitung\n\nWir verarbeiten Ihre personenbezogenen Daten ausschließlich auf Basis der folgenden Rechtsgrundlagen gemäß **Datenschutz-Grundverordnung (DSGVO)** und dem **österreichischen Datenschutzgesetz (DSG)**:\n\n| Rechtsgrundlage | DSGVO Artikel | Anwendungsbereich |\n|-----------------|---------------|-------------------|\n| Vertragserfüllung | Art. 6 Abs. 1 lit. b | Durchführung des Arbeits-/Überlassungsvertrags |\n| Rechtliche Verpflichtung | Art. 6 Abs. 1 lit. c | ASVG-Meldungen, Lohnsteuer, AÜG-Compliance |\n| Berechtigtes Interesse | Art. 6 Abs. 1 lit. f | Betrugsprävention, IT-Sicherheit |\n| Einwilligung | Art. 6 Abs. 1 lit. a | Marketing, optionale Datenverarbeitung |\n\n---\n\n## 3. Kategorien personenbezogener Daten\n\n### 3.1 Stammdaten\n- Vor- und Nachname\n- Geburtsdatum und Geburtsort\n- Staatsangehörigkeit\n- Geschlecht\n- Familienstand\n\n### 3.2 Kontaktdaten\n- E-Mail-Adresse\n- Telefonnummer\n- Wohnadresse\n\n### 3.3 Beschäftigungsdaten\n- Sozialversicherungsnummer (SVNR) gemäß ASVG\n- Steuernummer\n- Bankverbindung (IBAN)\n- Qualifikationen und Zertifikate\n- Arbeitszeitaufzeichnungen\n\n### 3.4 Besondere Kategorien (Art. 9 DSGVO)\n- Gesundheitsdaten (nur bei medizinischen Bescheinigungen)\n- Gewerkschaftszugehörigkeit (nur bei KV-Anwendung)\n\nDiese Daten werden nur mit ausdrücklicher Einwilligung oder aufgrund gesetzlicher Verpflichtung verarbeitet.\n\n---\n\n## 4. Zwecke der Verarbeitung\n\n### 4.1 Vertragserfüllung\n- Durchführung des Arbeitsvertrags gemäß **AÜG § 11**\n- Vermittlung von Arbeitseinsätzen\n- Arbeitszeiterfassung und Abrechnung\n- Lohn- und Gehaltsabrechnung\n\n### 4.2 Gesetzliche Verpflichtungen\n- ELDA-Meldungen an die ÖGK (gemäß **ASVG §§ 33-34**)\n- Lohnsteuerabzug und Meldung an das Finanzamt (**EStG**)\n- Aufbewahrungspflichten (**BAO § 132**: 7 Jahre für Geschäftsunterlagen)\n- AÜG-Meldepflichten an die Gewerbebehörde\n\n### 4.3 Berechtigte Interessen\n- Betrugsprävention und Identitätsprüfung\n- IT-Sicherheit und Systemstabilität\n- Qualitätssicherung und Prozessoptimierung\n\n---\n\n## 5. Empfänger der Daten\n\nIhre Daten werden an folgende Kategorien von Empfängern übermittelt:\n\n| Empfänger | Zweck | Rechtsgrundlage |\n|-----------|-------|-----------------|\n| ÖGK (Österreichische Gesundheitskasse) | Sozialversicherungsmeldungen | ASVG §§ 33-34 |\n| Finanzamt | Lohnsteuer, Lohnzettel | EStG § 84 |\n| Beschäftiger (Kundenunternehmen) | Arbeitseinsatz | AÜG § 12 |\n| Lohnverrechnungsdienstleister | Gehaltsabrechnung | Auftragsverarbeitung |\n| IT-Dienstleister | Hosting, Cloud-Services | Auftragsverarbeitung |\n\n---\n\n## 6. Speicherdauer\n\n| Datenkategorie | Speicherdauer | Rechtsgrundlage |\n|----------------|---------------|-----------------|\n| Lohnabrechnungsunterlagen | 7 Jahre | BAO § 132 |\n| Arbeitszeitaufzeichnungen | 3 Jahre nach Ende des Arbeitsverhältnisses | AZG § 26 |\n| SV-Meldungen | 7 Jahre | ASVG |\n| Bewerbungsunterlagen (bei Ablehnung) | 6 Monate | DSGVO Art. 17 |\n| Vertragsdokumente | 30 Jahre (Verjährungsfrist) | ABGB § 1489 |\n\n---\n\n## 7. Ihre Rechte nach DSGVO\n\nSie haben folgende Rechte bezüglich Ihrer personenbezogenen Daten:\n\n### 7.1 Auskunftsrecht (Art. 15 DSGVO)\nSie haben das Recht, eine Bestätigung darüber zu verlangen, ob personenbezogene Daten verarbeitet werden, und gegebenenfalls Auskunft über diese Daten zu erhalten.\n\n### 7.2 Recht auf Berichtigung (Art. 16 DSGVO)\nSie haben das Recht, unrichtige personenbezogene Daten unverzüglich berichtigen zu lassen.\n\n### 7.3 Recht auf Löschung (Art. 17 DSGVO)\nSie haben das Recht, die Löschung Ihrer Daten zu verlangen, sofern keine gesetzlichen Aufbewahrungspflichten entgegenstehen.\n\n### 7.4 Recht auf Einschränkung (Art. 18 DSGVO)\nSie haben das Recht, die Einschränkung der Verarbeitung zu verlangen.\n\n### 7.5 Recht auf Datenübertragbarkeit (Art. 20 DSGVO)\nSie haben das Recht, Ihre Daten in einem strukturierten, gängigen und maschinenlesbaren Format zu erhalten.\n\n### 7.6 Widerspruchsrecht (Art. 21 DSGVO)\nSie haben das Recht, gegen die Verarbeitung Ihrer Daten Widerspruch einzulegen.\n\n### 7.7 Recht auf Widerruf der Einwilligung (Art. 7 Abs. 3 DSGVO)\nSie haben das Recht, erteilte Einwilligungen jederzeit zu widerrufen.\n\n---\n\n## 8. Beschwerderecht bei der Aufsichtsbehörde\n\nSie haben das Recht, eine Beschwerde bei der zuständigen Aufsichtsbehörde einzureichen:\n\n**Österreichische Datenschutzbehörde**\nBarichgasse 40-42\n1030 Wien\n\n- **E-Mail:** dsb@dsb.gv.at\n- **Website:** https://www.dsb.gv.at\n\n---\n\n## 9. Automatisierte Entscheidungsfindung\n\nEs findet keine automatisierte Entscheidungsfindung im Sinne von **Art. 22 DSGVO** statt, die rechtliche Wirkung entfaltet oder Sie in ähnlicher Weise erheblich beeinträchtigt.\n\n---\n\n## 10. Drittlandübermittlung\n\nEine Übermittlung Ihrer Daten in Drittländer (außerhalb des EWR) erfolgt nur:\n- Auf Basis von Angemessenheitsbeschlüssen der EU-Kommission\n- Unter Verwendung von EU-Standardvertragsklauseln\n- Mit Ihrer ausdrücklichen Einwilligung\n\n---\n\n## 11. Änderungen dieser Datenschutzerklärung\n\nWir behalten uns vor, diese Datenschutzerklärung anzupassen, um sie an geänderte Rechtslagen oder bei Änderungen unserer Dienste anzupassen. Die aktuelle Version finden Sie stets unter: https://flexxr.at/legal/privacy_policy\n\n---\n\n## 12. Kontakt\n\nBei Fragen zum Datenschutz wenden Sie sich bitte an:\n\n**Flexxer**\nMusterstraße 1, 1010 Wien\nE-Mail: privacy@flexxr.at\n"
content_hash:
type: string
examples:
- 7d28b9a8ddc190e477a58a1d95a0a50d2f0428e19594df2dfff7742c94e784ff
public_url:
type:
- string
- 'null'
examples:
- null
requires_reacceptance:
type: boolean
examples:
- true
is_active:
type: boolean
examples:
- true
published_at:
type: string
examples:
- '2026-08-05T16:18:17+00:00'
created_at:
type: string
examples:
- '2026-08-05T16:18:17+00:00'
examples:
-
status: SUCCESS
data:
id: 019fd2b7-ef68-7312-a1a3-6b14820cf9e2
document_type: privacy_policy
version: 1
locale: de
title: Datenschutzerklärung
content: "# Datenschutzerklärung\n\n**Stand: 05.08.2026**\n**Version: 1.0**\n\n---\n\n## 1. Verantwortlicher\n\n**Flexxer**\nMusterstraße 1\n1010 Wien, Österreich\n\n- **Firmenbuchnummer:** FN 123456x\n- **UID-Nummer:** ATU12345678\n- **Telefon:** +43 1 234 5678\n- **E-Mail:** privacy@flexxr.at\n- **Website:** https://flexxr.at\n\n### 1.1 Datenschutzbeauftragter\n\nFür Fragen zum Datenschutz erreichen Sie unseren Datenschutzbeauftragten unter:\n- **E-Mail:** dpo@flexxr.at\n\n---\n\n## 2. Rechtsgrundlagen der Verarbeitung\n\nWir verarbeiten Ihre personenbezogenen Daten ausschließlich auf Basis der folgenden Rechtsgrundlagen gemäß **Datenschutz-Grundverordnung (DSGVO)** und dem **österreichischen Datenschutzgesetz (DSG)**:\n\n| Rechtsgrundlage | DSGVO Artikel | Anwendungsbereich |\n|-----------------|---------------|-------------------|\n| Vertragserfüllung | Art. 6 Abs. 1 lit. b | Durchführung des Arbeits-/Überlassungsvertrags |\n| Rechtliche Verpflichtung | Art. 6 Abs. 1 lit. c | ASVG-Meldungen, Lohnsteuer, AÜG-Compliance |\n| Berechtigtes Interesse | Art. 6 Abs. 1 lit. f | Betrugsprävention, IT-Sicherheit |\n| Einwilligung | Art. 6 Abs. 1 lit. a | Marketing, optionale Datenverarbeitung |\n\n---\n\n## 3. Kategorien personenbezogener Daten\n\n### 3.1 Stammdaten\n- Vor- und Nachname\n- Geburtsdatum und Geburtsort\n- Staatsangehörigkeit\n- Geschlecht\n- Familienstand\n\n### 3.2 Kontaktdaten\n- E-Mail-Adresse\n- Telefonnummer\n- Wohnadresse\n\n### 3.3 Beschäftigungsdaten\n- Sozialversicherungsnummer (SVNR) gemäß ASVG\n- Steuernummer\n- Bankverbindung (IBAN)\n- Qualifikationen und Zertifikate\n- Arbeitszeitaufzeichnungen\n\n### 3.4 Besondere Kategorien (Art. 9 DSGVO)\n- Gesundheitsdaten (nur bei medizinischen Bescheinigungen)\n- Gewerkschaftszugehörigkeit (nur bei KV-Anwendung)\n\nDiese Daten werden nur mit ausdrücklicher Einwilligung oder aufgrund gesetzlicher Verpflichtung verarbeitet.\n\n---\n\n## 4. Zwecke der Verarbeitung\n\n### 4.1 Vertragserfüllung\n- Durchführung des Arbeitsvertrags gemäß **AÜG § 11**\n- Vermittlung von Arbeitseinsätzen\n- Arbeitszeiterfassung und Abrechnung\n- Lohn- und Gehaltsabrechnung\n\n### 4.2 Gesetzliche Verpflichtungen\n- ELDA-Meldungen an die ÖGK (gemäß **ASVG §§ 33-34**)\n- Lohnsteuerabzug und Meldung an das Finanzamt (**EStG**)\n- Aufbewahrungspflichten (**BAO § 132**: 7 Jahre für Geschäftsunterlagen)\n- AÜG-Meldepflichten an die Gewerbebehörde\n\n### 4.3 Berechtigte Interessen\n- Betrugsprävention und Identitätsprüfung\n- IT-Sicherheit und Systemstabilität\n- Qualitätssicherung und Prozessoptimierung\n\n---\n\n## 5. Empfänger der Daten\n\nIhre Daten werden an folgende Kategorien von Empfängern übermittelt:\n\n| Empfänger | Zweck | Rechtsgrundlage |\n|-----------|-------|-----------------|\n| ÖGK (Österreichische Gesundheitskasse) | Sozialversicherungsmeldungen | ASVG §§ 33-34 |\n| Finanzamt | Lohnsteuer, Lohnzettel | EStG § 84 |\n| Beschäftiger (Kundenunternehmen) | Arbeitseinsatz | AÜG § 12 |\n| Lohnverrechnungsdienstleister | Gehaltsabrechnung | Auftragsverarbeitung |\n| IT-Dienstleister | Hosting, Cloud-Services | Auftragsverarbeitung |\n\n---\n\n## 6. Speicherdauer\n\n| Datenkategorie | Speicherdauer | Rechtsgrundlage |\n|----------------|---------------|-----------------|\n| Lohnabrechnungsunterlagen | 7 Jahre | BAO § 132 |\n| Arbeitszeitaufzeichnungen | 3 Jahre nach Ende des Arbeitsverhältnisses | AZG § 26 |\n| SV-Meldungen | 7 Jahre | ASVG |\n| Bewerbungsunterlagen (bei Ablehnung) | 6 Monate | DSGVO Art. 17 |\n| Vertragsdokumente | 30 Jahre (Verjährungsfrist) | ABGB § 1489 |\n\n---\n\n## 7. Ihre Rechte nach DSGVO\n\nSie haben folgende Rechte bezüglich Ihrer personenbezogenen Daten:\n\n### 7.1 Auskunftsrecht (Art. 15 DSGVO)\nSie haben das Recht, eine Bestätigung darüber zu verlangen, ob personenbezogene Daten verarbeitet werden, und gegebenenfalls Auskunft über diese Daten zu erhalten.\n\n### 7.2 Recht auf Berichtigung (Art. 16 DSGVO)\nSie haben das Recht, unrichtige personenbezogene Daten unverzüglich berichtigen zu lassen.\n\n### 7.3 Recht auf Löschung (Art. 17 DSGVO)\nSie haben das Recht, die Löschung Ihrer Daten zu verlangen, sofern keine gesetzlichen Aufbewahrungspflichten entgegenstehen.\n\n### 7.4 Recht auf Einschränkung (Art. 18 DSGVO)\nSie haben das Recht, die Einschränkung der Verarbeitung zu verlangen.\n\n### 7.5 Recht auf Datenübertragbarkeit (Art. 20 DSGVO)\nSie haben das Recht, Ihre Daten in einem strukturierten, gängigen und maschinenlesbaren Format zu erhalten.\n\n### 7.6 Widerspruchsrecht (Art. 21 DSGVO)\nSie haben das Recht, gegen die Verarbeitung Ihrer Daten Widerspruch einzulegen.\n\n### 7.7 Recht auf Widerruf der Einwilligung (Art. 7 Abs. 3 DSGVO)\nSie haben das Recht, erteilte Einwilligungen jederzeit zu widerrufen.\n\n---\n\n## 8. Beschwerderecht bei der Aufsichtsbehörde\n\nSie haben das Recht, eine Beschwerde bei der zuständigen Aufsichtsbehörde einzureichen:\n\n**Österreichische Datenschutzbehörde**\nBarichgasse 40-42\n1030 Wien\n\n- **E-Mail:** dsb@dsb.gv.at\n- **Website:** https://www.dsb.gv.at\n\n---\n\n## 9. Automatisierte Entscheidungsfindung\n\nEs findet keine automatisierte Entscheidungsfindung im Sinne von **Art. 22 DSGVO** statt, die rechtliche Wirkung entfaltet oder Sie in ähnlicher Weise erheblich beeinträchtigt.\n\n---\n\n## 10. Drittlandübermittlung\n\nEine Übermittlung Ihrer Daten in Drittländer (außerhalb des EWR) erfolgt nur:\n- Auf Basis von Angemessenheitsbeschlüssen der EU-Kommission\n- Unter Verwendung von EU-Standardvertragsklauseln\n- Mit Ihrer ausdrücklichen Einwilligung\n\n---\n\n## 11. Änderungen dieser Datenschutzerklärung\n\nWir behalten uns vor, diese Datenschutzerklärung anzupassen, um sie an geänderte Rechtslagen oder bei Änderungen unserer Dienste anzupassen. Die aktuelle Version finden Sie stets unter: https://flexxr.at/legal/privacy_policy\n\n---\n\n## 12. Kontakt\n\nBei Fragen zum Datenschutz wenden Sie sich bitte an:\n\n**Flexxer**\nMusterstraße 1, 1010 Wien\nE-Mail: privacy@flexxr.at\n"
content_hash: 7d28b9a8ddc190e477a58a1d95a0a50d2f0428e19594df2dfff7742c94e784ff
public_url: null
requires_reacceptance: true
is_active: true
published_at: '2026-08-05T16:18:17+00:00'
created_at: '2026-08-05T16:18:17+00:00'
tags:
- 'Admin API'
parameters:
-
in: path
name: legalDocument_id
description: 'The ID of the legalDocument.'
required: true
schema:
type: string
examples:
- 019f0593-c509-716b-8a38-d51a1a7de274
-
in: path
name: legalDocument
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
/api/v1/admin/support/tickets:
get:
summary: 'List Support Tickets'
operationId: listSupportTickets
description: 'The tickets visible to the caller, newest first, optionally narrowed by status.'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
tickets:
type: array
items:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-28b2-7322-b70c-bc7d76debfc3
ticket_number:
type: string
examples:
- TKT-717858
subject:
type: string
examples:
- 'Nihil autem neque blanditiis accusantium eaque.'
category:
type: string
examples:
- general
category_label:
type: string
examples:
- Allgemein
status:
type: string
examples:
- open
status_label:
type: string
examples:
- Offen
priority:
type: integer
examples:
- 3
requester_type:
type: string
examples:
- company
requester_name:
type: string
examples:
- Caritas
assignee_name:
type:
- string
- 'null'
examples:
- null
message_count:
type: integer
examples:
- 0
last_message_at:
type:
- string
- 'null'
examples:
- null
created_at:
type: string
examples:
- '2026-08-05T16:18:32+00:00'
examples:
-
-
id: 019fd2b8-28b2-7322-b70c-bc7d76debfc3
ticket_number: TKT-717858
subject: 'Nihil autem neque blanditiis accusantium eaque.'
category: general
category_label: Allgemein
status: open
status_label: Offen
priority: 3
requester_type: company
requester_name: Caritas
assignee_name: null
message_count: 0
last_message_at: null
created_at: '2026-08-05T16:18:32+00:00'
-
id: 019fd2b8-2e3b-7096-97f9-96d4a481c803
ticket_number: TKT-969367
subject: 'Totam autem repellendus quasi iste debitis fugiat.'
category: complaint
category_label: Beschwerde
status: open
status_label: Offen
priority: 2
requester_type: worker
requester_name: 'Anna Neuling'
assignee_name: null
message_count: 0
last_message_at: null
created_at: '2026-08-05T16:18:33+00:00'
pagination:
type: object
properties:
current_page:
type: integer
examples:
- 1
last_page:
type: integer
examples:
- 1
per_page:
type: integer
examples:
- 20
total:
type: integer
examples:
- 2
examples:
-
status: SUCCESS
data:
tickets:
-
id: 019fd2b8-28b2-7322-b70c-bc7d76debfc3
ticket_number: TKT-717858
subject: 'Nihil autem neque blanditiis accusantium eaque.'
category: general
category_label: Allgemein
status: open
status_label: Offen
priority: 3
requester_type: company
requester_name: Caritas
assignee_name: null
message_count: 0
last_message_at: null
created_at: '2026-08-05T16:18:32+00:00'
-
id: 019fd2b8-2e3b-7096-97f9-96d4a481c803
ticket_number: TKT-969367
subject: 'Totam autem repellendus quasi iste debitis fugiat.'
category: complaint
category_label: Beschwerde
status: open
status_label: Offen
priority: 2
requester_type: worker
requester_name: 'Anna Neuling'
assignee_name: null
message_count: 0
last_message_at: null
created_at: '2026-08-05T16:18:33+00:00'
pagination:
current_page: 1
last_page: 1
per_page: 20
total: 2
tags:
- 'Admin API'
'/api/v1/admin/support/tickets/{ticketId}':
get:
summary: 'Show a Support Ticket'
operationId: showASupportTicket
description: 'One ticket with its message thread. Internal notes are never included.'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-28b2-7322-b70c-bc7d76debfc3
ticket_number:
type: string
examples:
- TKT-717858
subject:
type: string
examples:
- 'Nihil autem neque blanditiis accusantium eaque.'
category:
type: string
examples:
- general
category_label:
type: string
examples:
- Allgemein
status:
type: string
examples:
- open
status_label:
type: string
examples:
- Offen
priority:
type: integer
examples:
- 3
requester_type:
type: string
examples:
- company
requester_name:
type: string
examples:
- Caritas
assignee_name:
type:
- string
- 'null'
examples:
- null
message_count:
type: integer
examples:
- 0
last_message_at:
type:
- string
- 'null'
examples:
- null
created_at:
type: string
examples:
- '2026-08-05T16:18:32+00:00'
description:
type: string
examples:
- "Quo necessitatibus et tempora esse nemo. Omnis et molestias sed expedita cupiditate.\n\nQuidem mollitia et reprehenderit enim quidem est. Temporibus et blanditiis iusto officia neque molestiae quidem. Adipisci suscipit sit temporibus voluptatum porro molestiae omnis. Rem fuga ratione ratione odio esse odio modi."
resolution_notes:
type:
- string
- 'null'
examples:
- null
related_entity_type:
type:
- string
- 'null'
examples:
- null
related_entity_id:
type:
- string
- 'null'
examples:
- null
assigned_to:
type:
- string
- 'null'
examples:
- null
first_response_at:
type:
- string
- 'null'
examples:
- null
resolved_at:
type:
- string
- 'null'
examples:
- null
messages:
type: array
examples:
- []
examples:
-
status: SUCCESS
data:
id: 019fd2b8-28b2-7322-b70c-bc7d76debfc3
ticket_number: TKT-717858
subject: 'Nihil autem neque blanditiis accusantium eaque.'
category: general
category_label: Allgemein
status: open
status_label: Offen
priority: 3
requester_type: company
requester_name: Caritas
assignee_name: null
message_count: 0
last_message_at: null
created_at: '2026-08-05T16:18:32+00:00'
description: "Quo necessitatibus et tempora esse nemo. Omnis et molestias sed expedita cupiditate.\n\nQuidem mollitia et reprehenderit enim quidem est. Temporibus et blanditiis iusto officia neque molestiae quidem. Adipisci suscipit sit temporibus voluptatum porro molestiae omnis. Rem fuga ratione ratione odio esse odio modi."
resolution_notes: null
related_entity_type: null
related_entity_id: null
assigned_to: null
first_response_at: null
resolved_at: null
messages: []
tags:
- 'Admin API'
parameters:
-
in: path
name: ticketId
description: 'The ticket.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
'/api/v1/admin/support/tickets/{ticketId}/assign':
post:
summary: 'Assign Ticket'
operationId: assignTicket
description: "POST /admin/support/tickets/{ticketId}/assign — assign to an agent,\ndefaulting to the acting admin."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-28b2-7322-b70c-bc7d76debfc3
assigned_to:
type: string
examples:
- 019fd2b7-edab-7280-b09f-b18f58a272ee
assignee_name:
type: string
examples:
- 'Super Admin'
examples:
-
status: SUCCESS
data:
id: 019fd2b8-28b2-7322-b70c-bc7d76debfc3
assigned_to: 019fd2b7-edab-7280-b09f-b18f58a272ee
assignee_name: 'Super Admin'
tags:
- 'Admin API'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
admin_id:
type: string
description: ''
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
parameters:
-
in: path
name: ticketId
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
'/api/v1/admin/support/tickets/{ticketId}/messages':
post:
summary: 'Reply to a Support Ticket'
operationId: replyToASupportTicket
description: 'Appends a message to an existing ticket.'
parameters: []
responses:
201:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Your message has been sent.'
data:
type: object
properties:
message:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-539c-7266-9498-f92f5406de4a
message:
type: string
examples:
- 'Bitte um Rueckmeldung zur naechsten Schicht.'
sender_type:
type: string
examples:
- agent
sender_name:
type: string
examples:
- 'Super Admin'
is_internal:
type: boolean
examples:
- true
attachments:
type:
- string
- 'null'
examples:
- null
created_at:
type: string
examples:
- '2026-08-05T16:18:43+00:00'
examples:
-
status: SUCCESS
message: 'Your message has been sent.'
data:
message:
id: 019fd2b8-539c-7266-9498-f92f5406de4a
message: 'Bitte um Rueckmeldung zur naechsten Schicht.'
sender_type: agent
sender_name: 'Super Admin'
is_internal: true
attachments: null
created_at: '2026-08-05T16:18:43+00:00'
tags:
- 'Admin API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
message:
type: string
description: ''
examples:
- 'Bitte um Rueckmeldung zur naechsten Schicht.'
is_internal:
type: boolean
description: ''
examples:
- true
required:
- message
parameters:
-
in: path
name: ticketId
description: 'The ticket.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
'/api/v1/admin/support/tickets/{ticketId}/status':
post:
summary: 'Update Ticket Status'
operationId: updateTicketStatus
description: "POST /admin/support/tickets/{ticketId}/status — transition a ticket.\n\"open\" reopens a resolved/closed ticket. Moving to \"resolved\" notifies\nthe requester and stamps resolved_at; \"closed\" stamps closed_at."
parameters: []
responses: { }
tags:
- 'Admin API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
status:
type: string
description: ''
examples:
- Beispieltext
resolution_notes:
type: string
description: ''
examples:
- Beispieltext
required:
- status
parameters:
-
in: path
name: ticketId
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
'/api/v1/admin/support/tickets/{ticketId}/priority':
post:
summary: 'Update Ticket Priority'
operationId: updateTicketPriority
description: 'POST /admin/support/tickets/{ticketId}/priority — 1 (low) .. 4 (urgent).'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-28b2-7322-b70c-bc7d76debfc3
priority:
type: integer
examples:
- 1
examples:
-
status: SUCCESS
data:
id: 019fd2b8-28b2-7322-b70c-bc7d76debfc3
priority: 1
tags:
- 'Admin API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
priority:
type: integer
description: ''
examples:
- 1
required:
- priority
parameters:
-
in: path
name: ticketId
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
/api/v1/org/auth/register:
post:
summary: 'Register Organization'
operationId: registerOrganization
description: 'Registers a new organization account. All new organizations begin with a `pending_verification` status. They can authenticate and receive tokens immediately but the `org.approved` middleware blocks access to protected dashboard endpoints until an admin verifies them.'
parameters: []
responses:
201:
description: Success
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- CREATED
message:
type: string
examples:
- 'Organization registered successfully.'
data:
type: object
properties:
token:
type: string
examples:
- 1|abcdef123456...
organization:
type: object
properties:
id:
type: string
examples:
- org-uuid
name:
type: string
examples:
- 'Water Foundation'
email:
type: string
examples:
- org@example.com
status:
type: string
examples:
- pending_verification
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-04-02T12:00:00.000000Z'
examples:
-
status: CREATED
message: 'Organization registered successfully.'
data:
token: 1|abcdef123456...
organization:
id: org-uuid
name: 'Water Foundation'
email: org@example.com
status: pending_verification
errors: null
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-04-02T12:00:00.000000Z'
409:
description: 'Email Already Registered'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- EMAIL_ALREADY_EXISTS
message:
type: string
examples:
- 'This email is already registered.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type: string
examples:
- email
message:
type: string
examples:
- 'This email is already registered.'
examples:
-
-
field: email
message: 'This email is already registered.'
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-04-02T12:00:00.000000Z'
examples:
-
status: EMAIL_ALREADY_EXISTS
message: 'This email is already registered.'
data: null
errors:
-
field: email
message: 'This email is already registered.'
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-04-02T12:00:00.000000Z'
422:
description: 'Validation Error'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- VALIDATION_ERROR
message:
type: string
examples:
- 'The given data was invalid.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type: string
examples:
- name
message:
type: string
examples:
- 'The name field is required.'
examples:
-
-
field: name
message: 'The name field is required.'
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-04-02T12:00:00.000000Z'
examples:
-
status: VALIDATION_ERROR
message: 'The given data was invalid.'
data: null
errors:
-
field: name
message: 'The name field is required.'
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-04-02T12:00:00.000000Z'
tags:
- 'Organization API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: 'Organization name (max 255).'
examples:
- 'Water Foundation'
email:
type: string
description: 'Organization email (max 255).'
examples:
- org@example.com
password:
type: string
description: 'Password (min 8, must be confirmed).'
examples:
- OrgPassword123
password_confirmation:
type: string
description: 'Password confirmation.'
examples:
- OrgPassword123
country_code:
type: string
description: 'Country calling code.'
examples:
- '+43'
phone_number:
type: string
description: 'Phone number (digits only).'
examples:
- '6641234567'
description:
type: string
description: 'Organization description (max 5000).'
examples:
- 'A charity focused on water access in developing nations.'
website:
type:
- string
- 'null'
description: 'optional Organization website URL.'
examples:
- 'https://waterfoundation.org'
address:
type:
- string
- 'null'
description: 'Must not be greater than 255 characters.'
examples:
- b
address_line2:
type:
- string
- 'null'
description: 'Must not be greater than 255 characters.'
examples:
- 'n'
uid_number:
type:
- string
- 'null'
description: 'Must match the regex /^ATU\d{8}$|^[A-Z]{2}[0-9A-Za-z+*.]{2,12}$/. Must not be greater than 20 characters.'
examples:
- gzmiyvdljnikhway
legal_form:
type:
- string
- 'null'
description: ''
enum:
- gmbh
- ag
- og
- kg
- gmbh_co_kg
- einzelunternehmen
- verein
- sonstige
examples:
- ag
firmenbuchnummer:
type:
- string
- 'null'
description: 'This field is required when legal_form is gmbh, ag, og, kg, or gmbh_co_kg. Must not be greater than 20 characters.'
examples:
- kcmyuwpwlvqwrsit
contact_person_name:
type:
- string
- 'null'
description: 'Must not be greater than 150 characters.'
examples:
- c
contact_person_phone:
type:
- string
- 'null'
description: 'Must not be greater than 30 characters.'
examples:
- p
industry_code:
type:
- string
- 'null'
description: 'Must not be greater than 10 characters.'
examples:
- scqldz
company_size:
type:
- string
- 'null'
description: ''
enum:
- 1-10
- 11-50
- 51-250
- 250+
examples:
- 11-50
terms_accepted:
type: boolean
description: 'Must be accepted.'
examples:
- true
avv_accepted:
type: boolean
description: 'Must be accepted.'
examples:
- true
postal_code:
type:
- string
- 'null'
description: 'Must not be greater than 20 characters.'
examples:
- snrwtujwvlxjklqp
city:
type:
- string
- 'null'
description: 'Must not be greater than 100 characters.'
examples:
- p
country:
type:
- string
- 'null'
description: 'Must not be greater than 100 characters.'
examples:
- w
iso_country_code:
type:
- string
- 'null'
description: 'Must be 2 characters.'
examples:
- qb
required:
- name
- email
- password
- password_confirmation
- country_code
- phone_number
- description
- terms_accepted
- avv_accepted
security: []
/api/v1/org/auth/login:
post:
summary: 'Login Organization'
operationId: loginOrganization
description: 'Authenticates an organization against the `organization` guard and issues a Sanctum token. If the organization has 2FA enabled a limited challenge token is returned. Note: the org.approved middleware is not applied here; it is applied on the protected routes. An organization in any status may log in — they simply cannot access protected endpoints until approved.'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Login successful.'
data:
type: object
properties:
token:
type: string
examples:
- 10|4Ucu33DSapxQkfLaVou7QWZebPNBb0UxdrbLmEPj11373a72
organization:
type: object
properties:
id:
type: string
examples:
- 019fd2b7-f072-7154-8961-5b324cc6c46c
name:
type: string
examples:
- Caritas
slug:
type: string
examples:
- caritas-4v1ues
email:
type: string
examples:
- caritas-portal@flexxr.eu.cc
country_code:
type: string
examples:
- '+43'
phone_number:
type: string
examples:
- '6641234567'
contact_person_name:
type:
- string
- 'null'
examples:
- null
contact_person_phone:
type:
- string
- 'null'
examples:
- null
iso_country_code:
type: string
examples:
- AT
phone_e164:
type: string
examples:
- '+436641234567'
description:
type: string
examples:
- 'Caritas test organisation used for end-to-end portal QA. Safe to delete.'
logo_url:
type:
- string
- 'null'
examples:
- null
website:
type: string
examples:
- 'https://www.caritas.at'
address:
type: string
examples:
- 'Albrechtskreithgasse 19-21'
address_line2:
type:
- string
- 'null'
examples:
- null
postal_code:
type:
- string
- 'null'
examples:
- null
city:
type: string
examples:
- Vienna
country:
type: string
examples:
- Austria
status:
type: string
examples:
- active
verified_at:
type: string
examples:
- '2026-08-05T16:18:17.000000Z'
is_verified:
type: boolean
examples:
- true
total_raised:
type:
- string
- 'null'
examples:
- null
created_at:
type: string
examples:
- '2026-08-05T16:18:17.000000Z'
platform_fee_flat_cents:
type: object
properties: { }
firmenbuchnummer:
type: object
properties: { }
uid_number:
type: object
properties: { }
uid_validation_status:
type: object
properties: { }
gisa_status:
type: object
properties: { }
payout_method:
type: object
properties: { }
stripe_connect_account_id:
type: object
properties: { }
connect_charges_enabled:
type: object
properties: { }
connect_payouts_enabled:
type: object
properties: { }
connect_details_submitted:
type: object
properties: { }
connect_requirements_due:
type: object
properties: { }
connect_country_code:
type: object
properties: { }
connect_external_account:
type: object
properties: { }
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 8a92c2fa-6959-4cc4-b267-75087ca278f0
timestamp:
type: string
examples:
- '2026-08-05T16:18:37.432170Z'
examples:
-
status: SUCCESS
message: 'Login successful.'
data:
token: 10|4Ucu33DSapxQkfLaVou7QWZebPNBb0UxdrbLmEPj11373a72
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
slug: caritas-4v1ues
email: caritas-portal@flexxr.eu.cc
country_code: '+43'
phone_number: '6641234567'
contact_person_name: null
contact_person_phone: null
iso_country_code: AT
phone_e164: '+436641234567'
description: 'Caritas test organisation used for end-to-end portal QA. Safe to delete.'
logo_url: null
website: 'https://www.caritas.at'
address: 'Albrechtskreithgasse 19-21'
address_line2: null
postal_code: null
city: Vienna
country: Austria
status: active
verified_at: '2026-08-05T16:18:17.000000Z'
is_verified: true
total_raised: null
created_at: '2026-08-05T16:18:17.000000Z'
platform_fee_flat_cents: { }
firmenbuchnummer: { }
uid_number: { }
uid_validation_status: { }
gisa_status: { }
payout_method: { }
stripe_connect_account_id: { }
connect_charges_enabled: { }
connect_payouts_enabled: { }
connect_details_submitted: { }
connect_requirements_due: { }
connect_country_code: { }
connect_external_account: { }
errors: null
meta:
request_id: 8a92c2fa-6959-4cc4-b267-75087ca278f0
timestamp: '2026-08-05T16:18:37.432170Z'
401:
description: ''
content:
application/json:
schema:
oneOf:
-
description: '2FA Required'
type: object
properties:
status:
type: string
examples:
- TWO_FACTOR_REQUIRED
message:
type: string
examples:
- 'Two-factor authentication is required.'
data:
type: object
properties:
token:
type: string
examples:
- 2|challenge-token...
two_factor_method:
type: string
examples:
- totp
errors:
type: array
items:
type: object
properties:
field:
type:
- string
- 'null'
examples:
- null
message:
type: string
examples:
- 'Two-factor authentication is required.'
examples:
-
-
field: null
message: 'Two-factor authentication is required.'
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-04-02T12:00:00.000000Z'
examples:
-
status: TWO_FACTOR_REQUIRED
message: 'Two-factor authentication is required.'
data:
token: 2|challenge-token...
two_factor_method: totp
errors:
-
field: null
message: 'Two-factor authentication is required.'
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-04-02T12:00:00.000000Z'
-
description: 'Invalid Credentials'
type: object
properties:
status:
type: string
examples:
- INVALID_CREDENTIALS
message:
type: string
examples:
- 'The provided credentials are incorrect.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type: string
examples:
- email
message:
type: string
examples:
- 'The provided credentials are incorrect.'
examples:
-
-
field: email
message: 'The provided credentials are incorrect.'
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-04-02T12:00:00.000000Z'
examples:
-
status: INVALID_CREDENTIALS
message: 'The provided credentials are incorrect.'
data: null
errors:
-
field: email
message: 'The provided credentials are incorrect.'
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-04-02T12:00:00.000000Z'
422:
description: 'Validation Error'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- VALIDATION_ERROR
message:
type: string
examples:
- 'The given data was invalid.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type: string
examples:
- email
message:
type: string
examples:
- 'The email field is required.'
examples:
-
-
field: email
message: 'The email field is required.'
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-04-02T12:00:00.000000Z'
examples:
-
status: VALIDATION_ERROR
message: 'The given data was invalid.'
data: null
errors:
-
field: email
message: 'The email field is required.'
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-04-02T12:00:00.000000Z'
423:
description: 'Account Temporarily Locked'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- ACCOUNT_TEMPORARILY_LOCKED
message:
type: string
examples:
- 'Account temporarily locked. Try again in 15 minutes.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type: string
examples:
- email
message:
type: string
examples:
- 'Account temporarily locked. Try again in 15 minutes.'
examples:
-
-
field: email
message: 'Account temporarily locked. Try again in 15 minutes.'
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-04-02T12:00:00.000000Z'
examples:
-
status: ACCOUNT_TEMPORARILY_LOCKED
message: 'Account temporarily locked. Try again in 15 minutes.'
data: null
errors:
-
field: email
message: 'Account temporarily locked. Try again in 15 minutes.'
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-04-02T12:00:00.000000Z'
tags:
- 'Organization API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
email:
type:
- string
- 'null'
description: 'Organization email address.'
examples:
- org@example.com
country_code:
type:
- string
- 'null'
description: 'Country code with + prefix. Required together with phone_number for phone login. This field is required when phone_number is present. Must match the regex /^\+\d{1,4}$/. Must not be greater than 5 characters.'
examples:
- '+43'
phone_number:
type:
- string
- 'null'
description: 'Phone number without country code. Required together with country_code for phone login. This field is required when country_code is present. Must match the regex /^\d{6,15}$/. Must not be greater than 15 characters.'
examples:
- '6641234567'
password:
type: string
description: 'Plain-text password (min 8 characters).'
examples:
- OrgPassword123
code:
type:
- string
- 'null'
description: 'Optional 2FA one-time code (TOTP or email OTP) for single-step 2FA login.'
examples:
- '123456'
recovery_code:
type:
- string
- 'null'
description: 'Optional 2FA recovery code in place of `code`.'
examples:
- ABCD-1234-EFGH
remember_me:
type: boolean
description: ''
examples:
- false
required:
- email
- password
security: []
/api/v1/org/auth/member/login:
post:
summary: 'Member Login'
operationId: memberLogin
description: "Authenticates an OrganizationMember using the linked User account's\nemail and password. Issues a Sanctum token scoped to the OrganizationMember\nmodel so the member can access the organisation routes independently of\nthe Organisation principal.\n\nWhen the member has 2FA enrolled a limited challenge token is returned\nand the client must complete the two-factor flow via the challenge\nendpoint before accessing protected resources.\n\nOnly members belonging to organisations with an Active status are permitted\nto reach the approved route group; this action itself does not block based\non org status (mirrors LoginOrganizationAction)."
parameters: []
responses:
200:
description: Success
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Login successful.'
data:
type: object
properties:
token:
type: string
examples:
- 1|abc...
member:
type: object
properties:
id:
type: string
examples:
- uuid
name:
type: string
examples:
- 'Jane Doe'
email:
type: string
examples:
- jane@example.com
role:
type: string
examples:
- member
organization_id:
type: string
examples:
- org-uuid
acl:
type: object
properties:
scope:
type: string
examples:
- org-member
presets:
type: array
items:
type: string
examples:
-
- viewer
permissions:
type: array
items:
type: string
examples:
-
- profile.view
- team.view
examples:
-
status: SUCCESS
message: 'Login successful.'
data:
token: 1|abc...
member:
id: uuid
name: 'Jane Doe'
email: jane@example.com
role: member
organization_id: org-uuid
acl:
scope: org-member
presets:
- viewer
permissions:
- profile.view
- team.view
401:
description: ''
content:
application/json:
schema:
oneOf:
-
description: '2FA Required'
type: object
properties:
status:
type: string
examples:
- TWO_FACTOR_REQUIRED
message:
type: string
examples:
- 'Two-factor authentication is required.'
data:
type: object
properties:
token:
type: string
examples:
- 2|challenge-token...
two_factor_method:
type: string
examples:
- totp
examples:
-
status: TWO_FACTOR_REQUIRED
message: 'Two-factor authentication is required.'
data:
token: 2|challenge-token...
two_factor_method: totp
-
description: 'Invalid Credentials'
type: object
properties:
status:
type: string
examples:
- INVALID_CREDENTIALS
message:
type: string
examples:
- 'The provided credentials are incorrect.'
examples:
-
status: INVALID_CREDENTIALS
message: 'The provided credentials are incorrect.'
tags:
- 'Organization API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
email:
type: string
description: "Email address of the member's User account."
examples:
- jane@example.com
password:
type: string
description: 'Password for the User account.'
examples:
- SecureP4ssword!
required:
- email
- password
security: []
/api/v1/org/security/recovery-codes/regenerate:
post:
summary: 'Regenerate Recovery Codes'
operationId: regenerateRecoveryCodes
description: "Generates a fresh set of single-use 2FA recovery codes, immediately invalidating the previous batch.\nCodes are returned in plain text exactly once — they cannot be retrieved again after this response.\nRequires 2FA to be enabled and confirmed."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Recovery codes regenerated. Store them securely — they will not be shown again.'
data:
type: object
properties:
recovery_codes:
type: array
items:
type: string
examples:
-
- GDLZX-N9LP9
- VPZAB-DJHRO
- 73VKY-CYUZU
- NB6X9-M7H4O
- HKRRW-SKJ2S
- 9FCNW-CBQ2E
- SW6IZ-ZHVXH
- DC8MJ-NXVZF
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 1d2ba116-7b58-49a0-a5a9-cdf820d35b7d
timestamp:
type: string
examples:
- '2026-08-05T16:18:38.620100Z'
examples:
-
status: SUCCESS
message: 'Recovery codes regenerated. Store them securely — they will not be shown again.'
data:
recovery_codes:
- GDLZX-N9LP9
- VPZAB-DJHRO
- 73VKY-CYUZU
- NB6X9-M7H4O
- HKRRW-SKJ2S
- 9FCNW-CBQ2E
- SW6IZ-ZHVXH
- DC8MJ-NXVZF
errors: null
meta:
request_id: 1d2ba116-7b58-49a0-a5a9-cdf820d35b7d
timestamp: '2026-08-05T16:18:38.620100Z'
403:
description: '2FA Not Enabled'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- FORBIDDEN
message:
type: string
examples:
- 'Two-factor authentication is not enabled.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-04-02T12:00:00.000000Z'
examples:
-
status: FORBIDDEN
message: 'Two-factor authentication is not enabled.'
data: null
errors: null
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-04-02T12:00:00.000000Z'
tags:
- 'Organization API'
/api/v1/org/profile:
get:
summary: 'Show Profile'
operationId: showProfile
description: "Returns the full profile of the organisation the caller belongs to. Invited members receive their company's profile, not their own membership record."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Profile retrieved successfully.'
data:
type: object
properties:
id:
type: string
examples:
- 019fd2b7-f072-7154-8961-5b324cc6c46c
name:
type: string
examples:
- Caritas
slug:
type: string
examples:
- caritas-4v1ues
email:
type: string
examples:
- caritas-portal@flexxr.eu.cc
country_code:
type: string
examples:
- '+43'
phone_number:
type: string
examples:
- '6641234567'
contact_person_name:
type:
- string
- 'null'
examples:
- null
contact_person_phone:
type:
- string
- 'null'
examples:
- null
iso_country_code:
type: string
examples:
- AT
phone_e164:
type: string
examples:
- '+436641234567'
description:
type: string
examples:
- 'Caritas test organisation used for end-to-end portal QA. Safe to delete.'
logo_url:
type:
- string
- 'null'
examples:
- null
website:
type: string
examples:
- 'https://www.caritas.at'
address:
type: string
examples:
- 'Albrechtskreithgasse 19-21'
address_line2:
type:
- string
- 'null'
examples:
- null
postal_code:
type:
- string
- 'null'
examples:
- null
city:
type: string
examples:
- Vienna
country:
type: string
examples:
- Austria
status:
type: string
examples:
- active
verified_at:
type: string
examples:
- '2026-08-05T16:18:17.000000Z'
is_verified:
type: boolean
examples:
- true
total_raised:
type:
- string
- 'null'
examples:
- null
created_at:
type: string
examples:
- '2026-08-05T16:18:17.000000Z'
platform_fee_flat_cents:
type:
- string
- 'null'
examples:
- null
firmenbuchnummer:
type:
- string
- 'null'
examples:
- null
uid_number:
type:
- string
- 'null'
examples:
- null
uid_validation_status:
type:
- string
- 'null'
examples:
- null
payout_method:
type:
- string
- 'null'
examples:
- null
stripe_connect_account_id:
type:
- string
- 'null'
examples:
- null
connect_charges_enabled:
type:
- string
- 'null'
examples:
- null
connect_payouts_enabled:
type:
- string
- 'null'
examples:
- null
connect_details_submitted:
type:
- string
- 'null'
examples:
- null
connect_requirements_due:
type:
- string
- 'null'
examples:
- null
connect_country_code:
type:
- string
- 'null'
examples:
- null
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- e435791d-4abf-49f0-ba30-628b75142d31
timestamp:
type: string
examples:
- '2026-08-05T16:18:37.730963Z'
examples:
-
status: SUCCESS
message: 'Profile retrieved successfully.'
data:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
slug: caritas-4v1ues
email: caritas-portal@flexxr.eu.cc
country_code: '+43'
phone_number: '6641234567'
contact_person_name: null
contact_person_phone: null
iso_country_code: AT
phone_e164: '+436641234567'
description: 'Caritas test organisation used for end-to-end portal QA. Safe to delete.'
logo_url: null
website: 'https://www.caritas.at'
address: 'Albrechtskreithgasse 19-21'
address_line2: null
postal_code: null
city: Vienna
country: Austria
status: active
verified_at: '2026-08-05T16:18:17.000000Z'
is_verified: true
total_raised: null
created_at: '2026-08-05T16:18:17.000000Z'
platform_fee_flat_cents: null
firmenbuchnummer: null
uid_number: null
uid_validation_status: null
payout_method: null
stripe_connect_account_id: null
connect_charges_enabled: null
connect_payouts_enabled: null
connect_details_submitted: null
connect_requirements_due: null
connect_country_code: null
errors: null
meta:
request_id: e435791d-4abf-49f0-ba30-628b75142d31
timestamp: '2026-08-05T16:18:37.730963Z'
tags:
- 'Organization API'
put:
summary: 'Update Org Profile'
operationId: updateOrgProfile
description: 'Updates mutable profile fields on the authenticated organisation. Only provided fields are applied; absent keys leave existing values untouched. Password and bank-detail changes have dedicated endpoints.'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Profile updated successfully.'
data:
type: object
properties:
id:
type: string
examples:
- 019fd2b7-f072-7154-8961-5b324cc6c46c
name:
type: string
examples:
- 'Hope Foundation'
slug:
type: string
examples:
- caritas-4v1ues
email:
type: string
examples:
- caritas-portal@flexxr.eu.cc
country_code:
type: string
examples:
- '+43'
phone_number:
type: string
examples:
- '13456789'
contact_person_name:
type: string
examples:
- u
contact_person_phone:
type: string
examples:
- w
iso_country_code:
type: string
examples:
- lx
phone_e164:
type: string
examples:
- '+4313456789'
description:
type: string
examples:
- 'A non-profit dedicated to helping communities.'
logo_url:
type:
- string
- 'null'
examples:
- null
website:
type: string
examples:
- 'https://hopefoundation.org'
address:
type: string
examples:
- 'Musterstr. 1'
address_line2:
type: string
examples:
- i
postal_code:
type: string
examples:
- tcpscqldzsnrwtuj
city:
type: string
examples:
- Berlin
country:
type: string
examples:
- Germany
status:
type: string
examples:
- active
verified_at:
type: string
examples:
- '2026-08-05T16:18:17.000000Z'
is_verified:
type: boolean
examples:
- true
total_raised:
type:
- string
- 'null'
examples:
- null
created_at:
type: string
examples:
- '2026-08-05T16:18:17.000000Z'
platform_fee_flat_cents:
type:
- string
- 'null'
examples:
- null
firmenbuchnummer:
type:
- string
- 'null'
examples:
- null
uid_number:
type:
- string
- 'null'
examples:
- null
uid_validation_status:
type:
- string
- 'null'
examples:
- null
payout_method:
type:
- string
- 'null'
examples:
- null
stripe_connect_account_id:
type:
- string
- 'null'
examples:
- null
connect_charges_enabled:
type:
- string
- 'null'
examples:
- null
connect_payouts_enabled:
type:
- string
- 'null'
examples:
- null
connect_details_submitted:
type:
- string
- 'null'
examples:
- null
connect_requirements_due:
type:
- string
- 'null'
examples:
- null
connect_country_code:
type:
- string
- 'null'
examples:
- null
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 4205ec1a-adaa-4fa2-a3e2-8cf17da36ec3
timestamp:
type: string
examples:
- '2026-08-05T16:18:37.748449Z'
examples:
-
status: SUCCESS
message: 'Profile updated successfully.'
data:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: 'Hope Foundation'
slug: caritas-4v1ues
email: caritas-portal@flexxr.eu.cc
country_code: '+43'
phone_number: '13456789'
contact_person_name: u
contact_person_phone: w
iso_country_code: lx
phone_e164: '+4313456789'
description: 'A non-profit dedicated to helping communities.'
logo_url: null
website: 'https://hopefoundation.org'
address: 'Musterstr. 1'
address_line2: i
postal_code: tcpscqldzsnrwtuj
city: Berlin
country: Germany
status: active
verified_at: '2026-08-05T16:18:17.000000Z'
is_verified: true
total_raised: null
created_at: '2026-08-05T16:18:17.000000Z'
platform_fee_flat_cents: null
firmenbuchnummer: null
uid_number: null
uid_validation_status: null
payout_method: null
stripe_connect_account_id: null
connect_charges_enabled: null
connect_payouts_enabled: null
connect_details_submitted: null
connect_requirements_due: null
connect_country_code: null
errors: null
meta:
request_id: 4205ec1a-adaa-4fa2-a3e2-8cf17da36ec3
timestamp: '2026-08-05T16:18:37.748449Z'
422:
description: 'Validation Error'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- VALIDATION_ERROR
message:
type: string
examples:
- 'Validation failed.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type: string
examples:
- phone_number
message:
type: string
examples:
- 'Phone number format is invalid.'
examples:
-
-
field: phone_number
message: 'Phone number format is invalid.'
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-04-02T12:00:00.000000Z'
examples:
-
status: VALIDATION_ERROR
message: 'Validation failed.'
data: null
errors:
-
field: phone_number
message: 'Phone number format is invalid.'
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-04-02T12:00:00.000000Z'
tags:
- 'Organization API'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: 'nullable Organization name (max 255).'
examples:
- 'Hope Foundation'
country_code:
type:
- string
- 'null'
description: 'nullable Phone country code with leading plus (e.g. +49).'
examples:
- '+49'
phone_number:
type:
- string
- 'null'
description: 'nullable Phone number digits only (max 20).'
examples:
- '1234567890'
contact_person_name:
type:
- string
- 'null'
description: 'Must not be greater than 150 characters.'
examples:
- u
contact_person_phone:
type:
- string
- 'null'
description: 'Must not be greater than 30 characters.'
examples:
- w
description:
type:
- string
- 'null'
description: 'nullable Organization description (max 5000).'
examples:
- 'A non-profit dedicated to helping communities.'
website:
type:
- string
- 'null'
description: 'nullable Website URL (max 255).'
examples:
- 'https://hopefoundation.org'
address:
type:
- string
- 'null'
description: 'nullable Street address (max 500).'
examples:
- 'Musterstr. 1'
address_line2:
type:
- string
- 'null'
description: 'Must not be greater than 255 characters.'
examples:
- i
postal_code:
type:
- string
- 'null'
description: 'Must not be greater than 20 characters.'
examples:
- tcpscqldzsnrwtuj
city:
type:
- string
- 'null'
description: 'nullable City name (max 100).'
examples:
- Berlin
country:
type:
- string
- 'null'
description: 'nullable Country name (max 100).'
examples:
- Germany
iso_country_code:
type:
- string
- 'null'
description: 'Must be 2 characters.'
examples:
- lx
/api/v1/org/profile/password:
put:
summary: 'Change Org Password'
operationId: changeOrgPassword
description: "Changes the authenticated organisation's login password. Requires the current password to be provided and verified before the new one is persisted. Pass `logout_other_devices: true` to revoke every other Sanctum session on the organisation account."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Password changed successfully.'
data:
type: object
properties:
revoked_sessions:
type: integer
examples:
- 0
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- dff4679b-ef2a-4fb9-94a7-48ac27abddfa
timestamp:
type: string
examples:
- '2026-08-05T16:18:38.445813Z'
examples:
-
status: SUCCESS
message: 'Password changed successfully.'
data:
revoked_sessions: 0
errors: null
meta:
request_id: dff4679b-ef2a-4fb9-94a7-48ac27abddfa
timestamp: '2026-08-05T16:18:38.445813Z'
422:
description: ''
content:
application/json:
schema:
oneOf:
-
description: 'Wrong Password'
type: object
properties:
status:
type: string
examples:
- VALIDATION_ERROR
message:
type: string
examples:
- 'The current password is incorrect.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type: string
examples:
- current_password
message:
type: string
examples:
- 'The current password is incorrect.'
examples:
-
-
field: current_password
message: 'The current password is incorrect.'
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-04-02T12:00:00.000000Z'
examples:
-
status: VALIDATION_ERROR
message: 'The current password is incorrect.'
data: null
errors:
-
field: current_password
message: 'The current password is incorrect.'
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-04-02T12:00:00.000000Z'
-
description: 'Password Reuse'
type: object
properties:
status:
type: string
examples:
- VALIDATION_ERROR
message:
type: string
examples:
- 'The given data was invalid.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type: string
examples:
- password
message:
type: string
examples:
- 'You cannot reuse your last 3 passwords.'
examples:
-
-
field: password
message: 'You cannot reuse your last 3 passwords.'
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-04-02T12:00:00.000000Z'
examples:
-
status: VALIDATION_ERROR
message: 'The given data was invalid.'
data: null
errors:
-
field: password
message: 'You cannot reuse your last 3 passwords.'
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-04-02T12:00:00.000000Z'
tags:
- 'Organization API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
current_password:
type: string
description: 'Current password for verification.'
examples:
- OldPassword123!
password:
type: string
description: 'New password (min 12 chars, 1 upper, 1 lower, 1 digit, must be confirmed).'
examples:
- NewPassword456!
logout_other_devices:
type: boolean
description: 'nullable Revoke all other active sessions if true.'
examples:
- true
password_confirmation:
type: string
description: 'Password confirmation.'
examples:
- NewPassword456!
required:
- current_password
- password
- password_confirmation
/api/v1/org/me:
get:
summary: 'Get Me'
operationId: getMe
description: "Returns the authenticated organisation's profile (name, email, avatar)."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- Success
data:
type: object
properties:
id:
type: string
examples:
- 019fd2b7-f072-7154-8961-5b324cc6c46c
name:
type: string
examples:
- Caritas
email:
type: string
examples:
- caritas-portal@flexxr.eu.cc
email_verified_at:
type:
- string
- 'null'
examples:
- null
avatar_url:
type:
- string
- 'null'
examples:
- null
created_at:
type: string
examples:
- '2026-08-05T16:18:17+00:00'
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- a45b6707-e121-40d2-a89f-c692e5d6c2bb
timestamp:
type: string
examples:
- '2026-08-05T16:18:38.460687Z'
examples:
-
status: SUCCESS
message: Success
data:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
email: caritas-portal@flexxr.eu.cc
email_verified_at: null
avatar_url: null
created_at: '2026-08-05T16:18:17+00:00'
errors: null
meta:
request_id: a45b6707-e121-40d2-a89f-c692e5d6c2bb
timestamp: '2026-08-05T16:18:38.460687Z'
tags:
- 'Organization API'
patch:
summary: 'Update Me'
operationId: updateMe
description: ''
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Profile updated successfully.'
data:
type: object
properties:
id:
type: string
examples:
- 019fd2b7-f072-7154-8961-5b324cc6c46c
name:
type: string
examples:
- 'ACME Foundation'
email:
type: string
examples:
- caritas-portal@flexxr.eu.cc
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 83d44c1f-73cb-42d8-b29f-3ec083b2921a
timestamp:
type: string
examples:
- '2026-08-05T16:18:38.470674Z'
examples:
-
status: SUCCESS
message: 'Profile updated successfully.'
data:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: 'ACME Foundation'
email: caritas-portal@flexxr.eu.cc
errors: null
meta:
request_id: 83d44c1f-73cb-42d8-b29f-3ec083b2921a
timestamp: '2026-08-05T16:18:38.470674Z'
422:
description: 'Validation Error'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- VALIDATION_ERROR
message:
type: string
examples:
- 'The given data was invalid.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type: string
examples:
- name
message:
type: string
examples:
- 'The name may not be greater than 255 characters.'
examples:
-
-
field: name
message: 'The name may not be greater than 255 characters.'
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-04-02T12:00:00.000000Z'
examples:
-
status: VALIDATION_ERROR
message: 'The given data was invalid.'
data: null
errors:
-
field: name
message: 'The name may not be greater than 255 characters.'
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-04-02T12:00:00.000000Z'
tags:
- 'Organization API'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: 'Optional. Display name.'
examples:
- 'ACME Foundation'
/api/v1/org/dashboard/stats:
get:
summary: 'Get Org Dashboard Stats'
operationId: getOrgDashboardStats
description: 'Returns aggregated dashboard statistics for the authenticated organisation.'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Dashboard statistics retrieved successfully.'
data:
type: object
properties:
users_count:
type: integer
examples:
- 1
pending_invitations:
type: integer
examples:
- 0
active_shifts:
type: integer
examples:
- 4
upcoming_jobs:
type: integer
examples:
- 4
pending_applicants:
type: integer
examples:
- 227
monthly_spend_cents:
type: integer
examples:
- 37747
attendance_rate_percent:
type: integer
examples:
- 13
open_positions:
type: integer
examples:
- 96
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 52103b61-fa39-4660-988a-b44356150484
timestamp:
type: string
examples:
- '2026-08-05T16:18:38.749634Z'
examples:
-
status: SUCCESS
message: 'Dashboard statistics retrieved successfully.'
data:
users_count: 1
pending_invitations: 0
active_shifts: 4
upcoming_jobs: 4
pending_applicants: 227
monthly_spend_cents: 37747
attendance_rate_percent: 13
open_positions: 96
errors: null
meta:
request_id: 52103b61-fa39-4660-988a-b44356150484
timestamp: '2026-08-05T16:18:38.749634Z'
tags:
- 'Organization API'
/api/v1/org/dashboard/trends:
get:
summary: 'Get Organisation Dashboard Trends'
operationId: getOrganisationDashboardTrends
description: "Daily activity series for the dashboard charts: shifts and applications over\nthe last 14 days (zero-filled) plus the current vacancy fill across open jobs."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
days:
type: array
items:
type: object
properties:
date:
type: string
examples:
- '2026-07-23'
shifts:
type: integer
examples:
- 0
completed:
type: integer
examples:
- 0
applications:
type: integer
examples:
- 0
examples:
-
-
date: '2026-07-23'
shifts: 0
completed: 0
applications: 0
-
date: '2026-07-24'
shifts: 0
completed: 0
applications: 0
-
date: '2026-07-25'
shifts: 0
completed: 0
applications: 0
-
date: '2026-07-26'
shifts: 0
completed: 0
applications: 0
-
date: '2026-07-27'
shifts: 0
completed: 0
applications: 0
-
date: '2026-07-28'
shifts: 0
completed: 0
applications: 0
-
date: '2026-07-29'
shifts: 0
completed: 0
applications: 0
-
date: '2026-07-30'
shifts: 0
completed: 0
applications: 0
-
date: '2026-07-31'
shifts: 0
completed: 0
applications: 28
-
date: '2026-08-01'
shifts: 0
completed: 0
applications: 111
-
date: '2026-08-02'
shifts: 0
completed: 0
applications: 77
-
date: '2026-08-03'
shifts: 1
completed: 1
applications: 12
-
date: '2026-08-04'
shifts: 1
completed: 0
applications: 4
-
date: '2026-08-05'
shifts: 1
completed: 0
applications: 1
vacancies:
type: object
properties:
total:
type: integer
examples:
- 96
filled:
type: integer
examples:
- 0
examples:
-
status: SUCCESS
data:
days:
-
date: '2026-07-23'
shifts: 0
completed: 0
applications: 0
-
date: '2026-07-24'
shifts: 0
completed: 0
applications: 0
-
date: '2026-07-25'
shifts: 0
completed: 0
applications: 0
-
date: '2026-07-26'
shifts: 0
completed: 0
applications: 0
-
date: '2026-07-27'
shifts: 0
completed: 0
applications: 0
-
date: '2026-07-28'
shifts: 0
completed: 0
applications: 0
-
date: '2026-07-29'
shifts: 0
completed: 0
applications: 0
-
date: '2026-07-30'
shifts: 0
completed: 0
applications: 0
-
date: '2026-07-31'
shifts: 0
completed: 0
applications: 28
-
date: '2026-08-01'
shifts: 0
completed: 0
applications: 111
-
date: '2026-08-02'
shifts: 0
completed: 0
applications: 77
-
date: '2026-08-03'
shifts: 1
completed: 1
applications: 12
-
date: '2026-08-04'
shifts: 1
completed: 0
applications: 4
-
date: '2026-08-05'
shifts: 1
completed: 0
applications: 1
vacancies:
total: 96
filled: 0
tags:
- 'Organization API'
/api/v1/org/team:
get:
summary: 'List Team Members'
operationId: listTeamMembers
description: "Returns the list of team members for the authenticated organisation:\nthe principal plus every accepted member. Each member row includes\nthe `presets` array of currently-assigned preset keys."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- Success
data:
type: array
items:
type: object
properties:
id:
type: string
examples:
- 019fd2b7-f072-7154-8961-5b324cc6c46c
name:
type: string
examples:
- Caritas
email:
type: string
examples:
- caritas-portal@flexxr.eu.cc
role:
type: string
examples:
- owner
status:
type: string
examples:
- active
avatar_url:
type:
- string
- 'null'
examples:
- null
is_self:
type: boolean
examples:
- true
is_primary_admin:
type: boolean
examples:
- true
is_active:
type: boolean
examples:
- true
presets:
type: array
examples:
- []
joined_at:
type: string
examples:
- '2026-08-05T16:18:17+00:00'
last_active_at:
type: string
examples:
- '2026-08-05T16:18:33+00:00'
examples:
-
-
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
email: caritas-portal@flexxr.eu.cc
role: owner
status: active
avatar_url: null
is_self: true
is_primary_admin: true
is_active: true
presets: []
joined_at: '2026-08-05T16:18:17+00:00'
last_active_at: '2026-08-05T16:18:33+00:00'
-
id: 019fd2b8-285e-707c-865a-ffbe4b08f730
name: 'Nikolas Klocko'
email: omacejkovic@example.net
role: admin
status: active
avatar_url: null
is_self: false
is_primary_admin: false
is_active: true
presets: []
joined_at: '2026-08-05T16:18:32+00:00'
last_active_at: null
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 89fd6657-4c88-42a0-aeea-ecc0ef10dd35
timestamp:
type: string
examples:
- '2026-08-05T16:18:38.792198Z'
examples:
-
status: SUCCESS
message: Success
data:
-
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
name: Caritas
email: caritas-portal@flexxr.eu.cc
role: owner
status: active
avatar_url: null
is_self: true
is_primary_admin: true
is_active: true
presets: []
joined_at: '2026-08-05T16:18:17+00:00'
last_active_at: '2026-08-05T16:18:33+00:00'
-
id: 019fd2b8-285e-707c-865a-ffbe4b08f730
name: 'Nikolas Klocko'
email: omacejkovic@example.net
role: admin
status: active
avatar_url: null
is_self: false
is_primary_admin: false
is_active: true
presets: []
joined_at: '2026-08-05T16:18:32+00:00'
last_active_at: null
errors: null
meta:
request_id: 89fd6657-4c88-42a0-aeea-ecc0ef10dd35
timestamp: '2026-08-05T16:18:38.792198Z'
tags:
- 'Organization API'
/api/v1/org/team/presets:
get:
summary: 'List Assignable Presets'
operationId: listAssignablePresets
description: "Returns the list of presets an org may assign to its team members.\nUsed by the dashboard's \"Manage roles\" dialog."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- Success
data:
type: array
items:
type: object
properties:
key:
type: string
examples:
- owner
label:
type: string
examples:
- Owner
description:
type: string
examples:
- 'Primary company owner with unrestricted access to all company features.'
permissions:
type: array
items:
type: string
examples:
-
- applicants.accept
- applicants.reject
- applicants.view
- assignments.manage
- assignments.view
- attendance.approve-hours
- attendance.report-noshow
- attendance.view
- audit.view
- gdpr.request
- invoices.download
- invoices.view
- jobs.configure-assignment
- jobs.create
- jobs.delete
- jobs.edit
- jobs.publish
- jobs.view
- messages.access
- notifications.preferences.manage
- payments.manage
- payments.view
- profile.edit
- profile.view
- ratings.create
- ratings.view
- reports.export
- reports.view
- requests.decide
- requests.view
- shifts.adjust
- shifts.cancel
- shifts.check-in
- shifts.dispute-time
- shifts.generate-qr
- shifts.report-signature-refusal
- shifts.view
- support.create-ticket
- support.view-tickets
- team.invite
- team.manage-roles
- team.remove
- team.view
category:
type:
- string
- 'null'
examples:
- null
highlights:
type: array
examples:
- []
risk_level:
type:
- string
- 'null'
examples:
- null
examples:
-
-
key: owner
label: Owner
description: 'Primary company owner with unrestricted access to all company features.'
permissions:
- applicants.accept
- applicants.reject
- applicants.view
- assignments.manage
- assignments.view
- attendance.approve-hours
- attendance.report-noshow
- attendance.view
- audit.view
- gdpr.request
- invoices.download
- invoices.view
- jobs.configure-assignment
- jobs.create
- jobs.delete
- jobs.edit
- jobs.publish
- jobs.view
- messages.access
- notifications.preferences.manage
- payments.manage
- payments.view
- profile.edit
- profile.view
- ratings.create
- ratings.view
- reports.export
- reports.view
- requests.decide
- requests.view
- shifts.adjust
- shifts.cancel
- shifts.check-in
- shifts.dispute-time
- shifts.generate-qr
- shifts.report-signature-refusal
- shifts.view
- support.create-ticket
- support.view-tickets
- team.invite
- team.manage-roles
- team.remove
- team.view
category: null
highlights: []
risk_level: null
-
key: org-admin
label: Admin
description: 'Company settings, team, jobs, applicants, attendance, and the company wallet.'
permissions:
- applicants.accept
- applicants.reject
- applicants.view
- assignments.manage
- assignments.view
- attendance.approve-hours
- attendance.report-noshow
- attendance.view
- audit.view
- jobs.configure-assignment
- jobs.create
- jobs.delete
- jobs.edit
- jobs.publish
- jobs.view
- messages.access
- notifications.preferences.manage
- payments.manage
- payments.view
- profile.edit
- profile.view
- ratings.create
- ratings.view
- reports.export
- reports.view
- requests.decide
- requests.view
- shifts.adjust
- shifts.cancel
- shifts.check-in
- shifts.dispute-time
- shifts.generate-qr
- shifts.report-signature-refusal
- shifts.view
- support.create-ticket
- support.view-tickets
- team.invite
- team.manage-roles
- team.remove
- team.view
category: null
highlights: []
risk_level: null
-
key: recruiter
label: Recruiter
description: 'Create and manage job listings, review and manage applicants.'
permissions:
- applicants.accept
- applicants.reject
- applicants.view
- jobs.configure-assignment
- jobs.create
- jobs.delete
- jobs.edit
- jobs.publish
- jobs.view
- messages.access
- ratings.view
- reports.view
- shifts.view
category: null
highlights: []
risk_level: null
-
key: shift-manager
label: 'Shift Manager'
description: 'Manage attendance, approve hours, and handle no-shows.'
permissions:
- assignments.view
- attendance.approve-hours
- attendance.report-noshow
- attendance.view
- messages.access
- ratings.create
- ratings.view
- reports.view
- requests.decide
- requests.view
- shifts.adjust
- shifts.cancel
- shifts.check-in
- shifts.dispute-time
- shifts.generate-qr
- shifts.report-signature-refusal
- shifts.view
category: null
highlights: []
risk_level: null
-
key: finance
label: Finance
description: 'View and manage invoices and payments.'
permissions:
- invoices.download
- invoices.view
- payments.manage
- payments.view
- reports.export
- reports.view
- requests.decide
- requests.view
category: null
highlights: []
risk_level: null
-
key: co-admin
label: Co-admin
description: 'Full access except team role management and member removal. Use "admin" instead.'
permissions:
- applicants.accept
- applicants.reject
- applicants.view
- assignments.manage
- assignments.view
- attendance.approve-hours
- attendance.report-noshow
- attendance.view
- audit.view
- gdpr.request
- invoices.download
- invoices.view
- jobs.configure-assignment
- jobs.create
- jobs.delete
- jobs.edit
- jobs.publish
- jobs.view
- messages.access
- notifications.preferences.manage
- payments.manage
- payments.view
- profile.edit
- profile.view
- ratings.create
- ratings.view
- reports.export
- reports.view
- requests.decide
- requests.view
- shifts.adjust
- shifts.cancel
- shifts.check-in
- shifts.dispute-time
- shifts.generate-qr
- shifts.report-signature-refusal
- shifts.view
- support.create-ticket
- support.view-tickets
- team.invite
- team.view
category: organization_admin
highlights:
- presets.co-admin.highlights.almost_full_access
- presets.co-admin.highlights.manage_team
- presets.co-admin.highlights.no_ownership_transfer
risk_level: high
-
key: manager
label: Manager
description: 'Operational team management. Use "admin" preset instead.'
permissions:
- applicants.accept
- applicants.reject
- applicants.view
- attendance.approve-hours
- attendance.report-noshow
- attendance.view
- jobs.configure-assignment
- jobs.create
- jobs.delete
- jobs.edit
- jobs.publish
- jobs.view
- notifications.preferences.manage
- profile.edit
- profile.view
- ratings.create
- ratings.view
- shifts.adjust
- shifts.cancel
- shifts.check-in
- shifts.dispute-time
- shifts.generate-qr
- shifts.report-signature-refusal
- shifts.view
- team.invite
- team.view
category: operations
highlights:
- presets.manager.highlights.edit_profile
- presets.manager.highlights.invite_members
- presets.manager.highlights.manage_notifications
risk_level: medium
-
key: viewer
label: Viewer
description: 'Read-only access. Cannot make any changes.'
permissions:
- applicants.view
- attendance.view
- invoices.view
- jobs.view
- profile.view
- ratings.view
- reports.view
- shifts.view
- team.view
category: read_only
highlights:
- presets.viewer.highlights.read_only
- presets.viewer.highlights.no_changes
risk_level: low
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- c429e72e-0dee-402b-939b-bc1bce7762b4
timestamp:
type: string
examples:
- '2026-08-05T16:18:38.809465Z'
examples:
-
status: SUCCESS
message: Success
data:
-
key: owner
label: Owner
description: 'Primary company owner with unrestricted access to all company features.'
permissions:
- applicants.accept
- applicants.reject
- applicants.view
- assignments.manage
- assignments.view
- attendance.approve-hours
- attendance.report-noshow
- attendance.view
- audit.view
- gdpr.request
- invoices.download
- invoices.view
- jobs.configure-assignment
- jobs.create
- jobs.delete
- jobs.edit
- jobs.publish
- jobs.view
- messages.access
- notifications.preferences.manage
- payments.manage
- payments.view
- profile.edit
- profile.view
- ratings.create
- ratings.view
- reports.export
- reports.view
- requests.decide
- requests.view
- shifts.adjust
- shifts.cancel
- shifts.check-in
- shifts.dispute-time
- shifts.generate-qr
- shifts.report-signature-refusal
- shifts.view
- support.create-ticket
- support.view-tickets
- team.invite
- team.manage-roles
- team.remove
- team.view
category: null
highlights: []
risk_level: null
-
key: org-admin
label: Admin
description: 'Company settings, team, jobs, applicants, attendance, and the company wallet.'
permissions:
- applicants.accept
- applicants.reject
- applicants.view
- assignments.manage
- assignments.view
- attendance.approve-hours
- attendance.report-noshow
- attendance.view
- audit.view
- jobs.configure-assignment
- jobs.create
- jobs.delete
- jobs.edit
- jobs.publish
- jobs.view
- messages.access
- notifications.preferences.manage
- payments.manage
- payments.view
- profile.edit
- profile.view
- ratings.create
- ratings.view
- reports.export
- reports.view
- requests.decide
- requests.view
- shifts.adjust
- shifts.cancel
- shifts.check-in
- shifts.dispute-time
- shifts.generate-qr
- shifts.report-signature-refusal
- shifts.view
- support.create-ticket
- support.view-tickets
- team.invite
- team.manage-roles
- team.remove
- team.view
category: null
highlights: []
risk_level: null
-
key: recruiter
label: Recruiter
description: 'Create and manage job listings, review and manage applicants.'
permissions:
- applicants.accept
- applicants.reject
- applicants.view
- jobs.configure-assignment
- jobs.create
- jobs.delete
- jobs.edit
- jobs.publish
- jobs.view
- messages.access
- ratings.view
- reports.view
- shifts.view
category: null
highlights: []
risk_level: null
-
key: shift-manager
label: 'Shift Manager'
description: 'Manage attendance, approve hours, and handle no-shows.'
permissions:
- assignments.view
- attendance.approve-hours
- attendance.report-noshow
- attendance.view
- messages.access
- ratings.create
- ratings.view
- reports.view
- requests.decide
- requests.view
- shifts.adjust
- shifts.cancel
- shifts.check-in
- shifts.dispute-time
- shifts.generate-qr
- shifts.report-signature-refusal
- shifts.view
category: null
highlights: []
risk_level: null
-
key: finance
label: Finance
description: 'View and manage invoices and payments.'
permissions:
- invoices.download
- invoices.view
- payments.manage
- payments.view
- reports.export
- reports.view
- requests.decide
- requests.view
category: null
highlights: []
risk_level: null
-
key: co-admin
label: Co-admin
description: 'Full access except team role management and member removal. Use "admin" instead.'
permissions:
- applicants.accept
- applicants.reject
- applicants.view
- assignments.manage
- assignments.view
- attendance.approve-hours
- attendance.report-noshow
- attendance.view
- audit.view
- gdpr.request
- invoices.download
- invoices.view
- jobs.configure-assignment
- jobs.create
- jobs.delete
- jobs.edit
- jobs.publish
- jobs.view
- messages.access
- notifications.preferences.manage
- payments.manage
- payments.view
- profile.edit
- profile.view
- ratings.create
- ratings.view
- reports.export
- reports.view
- requests.decide
- requests.view
- shifts.adjust
- shifts.cancel
- shifts.check-in
- shifts.dispute-time
- shifts.generate-qr
- shifts.report-signature-refusal
- shifts.view
- support.create-ticket
- support.view-tickets
- team.invite
- team.view
category: organization_admin
highlights:
- presets.co-admin.highlights.almost_full_access
- presets.co-admin.highlights.manage_team
- presets.co-admin.highlights.no_ownership_transfer
risk_level: high
-
key: manager
label: Manager
description: 'Operational team management. Use "admin" preset instead.'
permissions:
- applicants.accept
- applicants.reject
- applicants.view
- attendance.approve-hours
- attendance.report-noshow
- attendance.view
- jobs.configure-assignment
- jobs.create
- jobs.delete
- jobs.edit
- jobs.publish
- jobs.view
- notifications.preferences.manage
- profile.edit
- profile.view
- ratings.create
- ratings.view
- shifts.adjust
- shifts.cancel
- shifts.check-in
- shifts.dispute-time
- shifts.generate-qr
- shifts.report-signature-refusal
- shifts.view
- team.invite
- team.view
category: operations
highlights:
- presets.manager.highlights.edit_profile
- presets.manager.highlights.invite_members
- presets.manager.highlights.manage_notifications
risk_level: medium
-
key: viewer
label: Viewer
description: 'Read-only access. Cannot make any changes.'
permissions:
- applicants.view
- attendance.view
- invoices.view
- jobs.view
- profile.view
- ratings.view
- reports.view
- shifts.view
- team.view
category: read_only
highlights:
- presets.viewer.highlights.read_only
- presets.viewer.highlights.no_changes
risk_level: low
errors: null
meta:
request_id: c429e72e-0dee-402b-939b-bc1bce7762b4
timestamp: '2026-08-05T16:18:38.809465Z'
tags:
- 'Organization API'
/api/v1/org/team/roles:
get:
summary: 'List Assignable Roles and Presets'
operationId: listAssignableRolesAndPresets
description: "The roles a member may hold and the presets that may be granted to them —\neverything the portal's team screens need to render a role picker and the\npermission matrix without hardcoding either list.\n\nOwner is excluded: ownership is the organisation account itself and is never\nassigned to a member."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- Success
data:
type: object
properties:
roles:
type: array
items:
type: object
properties:
id:
type: string
examples:
- admin
label:
type: string
examples:
- Admin
description:
type: string
examples:
- 'Company settings, team, jobs, applicants, attendance, and the company wallet.'
permissions:
type: array
items:
type: string
examples:
-
- applicants.accept
- applicants.reject
- applicants.view
- assignments.manage
- assignments.view
- attendance.approve-hours
- attendance.report-noshow
- attendance.view
- audit.view
- jobs.configure-assignment
- jobs.create
- jobs.delete
- jobs.edit
- jobs.publish
- jobs.view
- messages.access
- notifications.preferences.manage
- payments.manage
- payments.view
- profile.edit
- profile.view
- ratings.create
- ratings.view
- reports.export
- reports.view
- requests.decide
- requests.view
- shifts.adjust
- shifts.cancel
- shifts.check-in
- shifts.dispute-time
- shifts.generate-qr
- shifts.report-signature-refusal
- shifts.view
- support.create-ticket
- support.view-tickets
- team.invite
- team.manage-roles
- team.remove
- team.view
examples:
-
-
id: admin
label: Admin
description: 'Company settings, team, jobs, applicants, attendance, and the company wallet.'
permissions:
- applicants.accept
- applicants.reject
- applicants.view
- assignments.manage
- assignments.view
- attendance.approve-hours
- attendance.report-noshow
- attendance.view
- audit.view
- jobs.configure-assignment
- jobs.create
- jobs.delete
- jobs.edit
- jobs.publish
- jobs.view
- messages.access
- notifications.preferences.manage
- payments.manage
- payments.view
- profile.edit
- profile.view
- ratings.create
- ratings.view
- reports.export
- reports.view
- requests.decide
- requests.view
- shifts.adjust
- shifts.cancel
- shifts.check-in
- shifts.dispute-time
- shifts.generate-qr
- shifts.report-signature-refusal
- shifts.view
- support.create-ticket
- support.view-tickets
- team.invite
- team.manage-roles
- team.remove
- team.view
-
id: recruiter
label: Recruiter
description: 'Create and manage job listings, review and manage applicants.'
permissions:
- applicants.accept
- applicants.reject
- applicants.view
- jobs.configure-assignment
- jobs.create
- jobs.delete
- jobs.edit
- jobs.publish
- jobs.view
- messages.access
- ratings.view
- reports.view
- shifts.view
-
id: shift_manager
label: 'Shift Manager'
description: 'Manage attendance, approve hours, and handle no-shows.'
permissions:
- assignments.view
- attendance.approve-hours
- attendance.report-noshow
- attendance.view
- messages.access
- ratings.create
- ratings.view
- reports.view
- requests.decide
- requests.view
- shifts.adjust
- shifts.cancel
- shifts.check-in
- shifts.dispute-time
- shifts.generate-qr
- shifts.report-signature-refusal
- shifts.view
-
id: finance
label: Finance
description: 'View and manage invoices and payments.'
permissions:
- invoices.download
- invoices.view
- payments.manage
- payments.view
- reports.export
- reports.view
- requests.decide
- requests.view
presets:
type: array
items:
type: object
properties:
id:
type: string
examples:
- owner
label:
type: string
examples:
- Owner
description:
type: string
examples:
- 'Primary company owner with unrestricted access to all company features.'
permissions:
type: array
items:
type: string
examples:
-
- applicants.accept
- applicants.reject
- applicants.view
- assignments.manage
- assignments.view
- attendance.approve-hours
- attendance.report-noshow
- attendance.view
- audit.view
- gdpr.request
- invoices.download
- invoices.view
- jobs.configure-assignment
- jobs.create
- jobs.delete
- jobs.edit
- jobs.publish
- jobs.view
- messages.access
- notifications.preferences.manage
- payments.manage
- payments.view
- profile.edit
- profile.view
- ratings.create
- ratings.view
- reports.export
- reports.view
- requests.decide
- requests.view
- shifts.adjust
- shifts.cancel
- shifts.check-in
- shifts.dispute-time
- shifts.generate-qr
- shifts.report-signature-refusal
- shifts.view
- support.create-ticket
- support.view-tickets
- team.invite
- team.manage-roles
- team.remove
- team.view
category:
type:
- string
- 'null'
examples:
- null
risk_level:
type:
- string
- 'null'
examples:
- null
examples:
-
-
id: owner
label: Owner
description: 'Primary company owner with unrestricted access to all company features.'
permissions:
- applicants.accept
- applicants.reject
- applicants.view
- assignments.manage
- assignments.view
- attendance.approve-hours
- attendance.report-noshow
- attendance.view
- audit.view
- gdpr.request
- invoices.download
- invoices.view
- jobs.configure-assignment
- jobs.create
- jobs.delete
- jobs.edit
- jobs.publish
- jobs.view
- messages.access
- notifications.preferences.manage
- payments.manage
- payments.view
- profile.edit
- profile.view
- ratings.create
- ratings.view
- reports.export
- reports.view
- requests.decide
- requests.view
- shifts.adjust
- shifts.cancel
- shifts.check-in
- shifts.dispute-time
- shifts.generate-qr
- shifts.report-signature-refusal
- shifts.view
- support.create-ticket
- support.view-tickets
- team.invite
- team.manage-roles
- team.remove
- team.view
category: null
risk_level: null
-
id: org-admin
label: Admin
description: 'Company settings, team, jobs, applicants, attendance, and the company wallet.'
permissions:
- applicants.accept
- applicants.reject
- applicants.view
- assignments.manage
- assignments.view
- attendance.approve-hours
- attendance.report-noshow
- attendance.view
- audit.view
- jobs.configure-assignment
- jobs.create
- jobs.delete
- jobs.edit
- jobs.publish
- jobs.view
- messages.access
- notifications.preferences.manage
- payments.manage
- payments.view
- profile.edit
- profile.view
- ratings.create
- ratings.view
- reports.export
- reports.view
- requests.decide
- requests.view
- shifts.adjust
- shifts.cancel
- shifts.check-in
- shifts.dispute-time
- shifts.generate-qr
- shifts.report-signature-refusal
- shifts.view
- support.create-ticket
- support.view-tickets
- team.invite
- team.manage-roles
- team.remove
- team.view
category: null
risk_level: null
-
id: recruiter
label: Recruiter
description: 'Create and manage job listings, review and manage applicants.'
permissions:
- applicants.accept
- applicants.reject
- applicants.view
- jobs.configure-assignment
- jobs.create
- jobs.delete
- jobs.edit
- jobs.publish
- jobs.view
- messages.access
- ratings.view
- reports.view
- shifts.view
category: null
risk_level: null
-
id: shift-manager
label: 'Shift Manager'
description: 'Manage attendance, approve hours, and handle no-shows.'
permissions:
- assignments.view
- attendance.approve-hours
- attendance.report-noshow
- attendance.view
- messages.access
- ratings.create
- ratings.view
- reports.view
- requests.decide
- requests.view
- shifts.adjust
- shifts.cancel
- shifts.check-in
- shifts.dispute-time
- shifts.generate-qr
- shifts.report-signature-refusal
- shifts.view
category: null
risk_level: null
-
id: finance
label: Finance
description: 'View and manage invoices and payments.'
permissions:
- invoices.download
- invoices.view
- payments.manage
- payments.view
- reports.export
- reports.view
- requests.decide
- requests.view
category: null
risk_level: null
-
id: co-admin
label: Co-admin
description: 'Full access except team role management and member removal. Use "admin" instead.'
permissions:
- applicants.accept
- applicants.reject
- applicants.view
- assignments.manage
- assignments.view
- attendance.approve-hours
- attendance.report-noshow
- attendance.view
- audit.view
- gdpr.request
- invoices.download
- invoices.view
- jobs.configure-assignment
- jobs.create
- jobs.delete
- jobs.edit
- jobs.publish
- jobs.view
- messages.access
- notifications.preferences.manage
- payments.manage
- payments.view
- profile.edit
- profile.view
- ratings.create
- ratings.view
- reports.export
- reports.view
- requests.decide
- requests.view
- shifts.adjust
- shifts.cancel
- shifts.check-in
- shifts.dispute-time
- shifts.generate-qr
- shifts.report-signature-refusal
- shifts.view
- support.create-ticket
- support.view-tickets
- team.invite
- team.view
category: organization_admin
risk_level: high
-
id: manager
label: Manager
description: 'Operational team management. Use "admin" preset instead.'
permissions:
- applicants.accept
- applicants.reject
- applicants.view
- attendance.approve-hours
- attendance.report-noshow
- attendance.view
- jobs.configure-assignment
- jobs.create
- jobs.delete
- jobs.edit
- jobs.publish
- jobs.view
- notifications.preferences.manage
- profile.edit
- profile.view
- ratings.create
- ratings.view
- shifts.adjust
- shifts.cancel
- shifts.check-in
- shifts.dispute-time
- shifts.generate-qr
- shifts.report-signature-refusal
- shifts.view
- team.invite
- team.view
category: operations
risk_level: medium
-
id: viewer
label: Viewer
description: 'Read-only access. Cannot make any changes.'
permissions:
- applicants.view
- attendance.view
- invoices.view
- jobs.view
- profile.view
- ratings.view
- reports.view
- shifts.view
- team.view
category: read_only
risk_level: low
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 936accb8-3905-4985-9c5c-f3310da1c479
timestamp:
type: string
examples:
- '2026-08-05T16:18:38.827828Z'
examples:
-
status: SUCCESS
message: Success
data:
roles:
-
id: admin
label: Admin
description: 'Company settings, team, jobs, applicants, attendance, and the company wallet.'
permissions:
- applicants.accept
- applicants.reject
- applicants.view
- assignments.manage
- assignments.view
- attendance.approve-hours
- attendance.report-noshow
- attendance.view
- audit.view
- jobs.configure-assignment
- jobs.create
- jobs.delete
- jobs.edit
- jobs.publish
- jobs.view
- messages.access
- notifications.preferences.manage
- payments.manage
- payments.view
- profile.edit
- profile.view
- ratings.create
- ratings.view
- reports.export
- reports.view
- requests.decide
- requests.view
- shifts.adjust
- shifts.cancel
- shifts.check-in
- shifts.dispute-time
- shifts.generate-qr
- shifts.report-signature-refusal
- shifts.view
- support.create-ticket
- support.view-tickets
- team.invite
- team.manage-roles
- team.remove
- team.view
-
id: recruiter
label: Recruiter
description: 'Create and manage job listings, review and manage applicants.'
permissions:
- applicants.accept
- applicants.reject
- applicants.view
- jobs.configure-assignment
- jobs.create
- jobs.delete
- jobs.edit
- jobs.publish
- jobs.view
- messages.access
- ratings.view
- reports.view
- shifts.view
-
id: shift_manager
label: 'Shift Manager'
description: 'Manage attendance, approve hours, and handle no-shows.'
permissions:
- assignments.view
- attendance.approve-hours
- attendance.report-noshow
- attendance.view
- messages.access
- ratings.create
- ratings.view
- reports.view
- requests.decide
- requests.view
- shifts.adjust
- shifts.cancel
- shifts.check-in
- shifts.dispute-time
- shifts.generate-qr
- shifts.report-signature-refusal
- shifts.view
-
id: finance
label: Finance
description: 'View and manage invoices and payments.'
permissions:
- invoices.download
- invoices.view
- payments.manage
- payments.view
- reports.export
- reports.view
- requests.decide
- requests.view
presets:
-
id: owner
label: Owner
description: 'Primary company owner with unrestricted access to all company features.'
permissions:
- applicants.accept
- applicants.reject
- applicants.view
- assignments.manage
- assignments.view
- attendance.approve-hours
- attendance.report-noshow
- attendance.view
- audit.view
- gdpr.request
- invoices.download
- invoices.view
- jobs.configure-assignment
- jobs.create
- jobs.delete
- jobs.edit
- jobs.publish
- jobs.view
- messages.access
- notifications.preferences.manage
- payments.manage
- payments.view
- profile.edit
- profile.view
- ratings.create
- ratings.view
- reports.export
- reports.view
- requests.decide
- requests.view
- shifts.adjust
- shifts.cancel
- shifts.check-in
- shifts.dispute-time
- shifts.generate-qr
- shifts.report-signature-refusal
- shifts.view
- support.create-ticket
- support.view-tickets
- team.invite
- team.manage-roles
- team.remove
- team.view
category: null
risk_level: null
-
id: org-admin
label: Admin
description: 'Company settings, team, jobs, applicants, attendance, and the company wallet.'
permissions:
- applicants.accept
- applicants.reject
- applicants.view
- assignments.manage
- assignments.view
- attendance.approve-hours
- attendance.report-noshow
- attendance.view
- audit.view
- jobs.configure-assignment
- jobs.create
- jobs.delete
- jobs.edit
- jobs.publish
- jobs.view
- messages.access
- notifications.preferences.manage
- payments.manage
- payments.view
- profile.edit
- profile.view
- ratings.create
- ratings.view
- reports.export
- reports.view
- requests.decide
- requests.view
- shifts.adjust
- shifts.cancel
- shifts.check-in
- shifts.dispute-time
- shifts.generate-qr
- shifts.report-signature-refusal
- shifts.view
- support.create-ticket
- support.view-tickets
- team.invite
- team.manage-roles
- team.remove
- team.view
category: null
risk_level: null
-
id: recruiter
label: Recruiter
description: 'Create and manage job listings, review and manage applicants.'
permissions:
- applicants.accept
- applicants.reject
- applicants.view
- jobs.configure-assignment
- jobs.create
- jobs.delete
- jobs.edit
- jobs.publish
- jobs.view
- messages.access
- ratings.view
- reports.view
- shifts.view
category: null
risk_level: null
-
id: shift-manager
label: 'Shift Manager'
description: 'Manage attendance, approve hours, and handle no-shows.'
permissions:
- assignments.view
- attendance.approve-hours
- attendance.report-noshow
- attendance.view
- messages.access
- ratings.create
- ratings.view
- reports.view
- requests.decide
- requests.view
- shifts.adjust
- shifts.cancel
- shifts.check-in
- shifts.dispute-time
- shifts.generate-qr
- shifts.report-signature-refusal
- shifts.view
category: null
risk_level: null
-
id: finance
label: Finance
description: 'View and manage invoices and payments.'
permissions:
- invoices.download
- invoices.view
- payments.manage
- payments.view
- reports.export
- reports.view
- requests.decide
- requests.view
category: null
risk_level: null
-
id: co-admin
label: Co-admin
description: 'Full access except team role management and member removal. Use "admin" instead.'
permissions:
- applicants.accept
- applicants.reject
- applicants.view
- assignments.manage
- assignments.view
- attendance.approve-hours
- attendance.report-noshow
- attendance.view
- audit.view
- gdpr.request
- invoices.download
- invoices.view
- jobs.configure-assignment
- jobs.create
- jobs.delete
- jobs.edit
- jobs.publish
- jobs.view
- messages.access
- notifications.preferences.manage
- payments.manage
- payments.view
- profile.edit
- profile.view
- ratings.create
- ratings.view
- reports.export
- reports.view
- requests.decide
- requests.view
- shifts.adjust
- shifts.cancel
- shifts.check-in
- shifts.dispute-time
- shifts.generate-qr
- shifts.report-signature-refusal
- shifts.view
- support.create-ticket
- support.view-tickets
- team.invite
- team.view
category: organization_admin
risk_level: high
-
id: manager
label: Manager
description: 'Operational team management. Use "admin" preset instead.'
permissions:
- applicants.accept
- applicants.reject
- applicants.view
- attendance.approve-hours
- attendance.report-noshow
- attendance.view
- jobs.configure-assignment
- jobs.create
- jobs.delete
- jobs.edit
- jobs.publish
- jobs.view
- notifications.preferences.manage
- profile.edit
- profile.view
- ratings.create
- ratings.view
- shifts.adjust
- shifts.cancel
- shifts.check-in
- shifts.dispute-time
- shifts.generate-qr
- shifts.report-signature-refusal
- shifts.view
- team.invite
- team.view
category: operations
risk_level: medium
-
id: viewer
label: Viewer
description: 'Read-only access. Cannot make any changes.'
permissions:
- applicants.view
- attendance.view
- invoices.view
- jobs.view
- profile.view
- ratings.view
- reports.view
- shifts.view
- team.view
category: read_only
risk_level: low
errors: null
meta:
request_id: 936accb8-3905-4985-9c5c-f3310da1c479
timestamp: '2026-08-05T16:18:38.827828Z'
tags:
- 'Organization API'
/api/v1/org/team/invitations:
get:
summary: 'List Team Invitations'
operationId: listTeamInvitations
description: 'Returns all pending invitations for the authenticated organisation, newest first.'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- Success
data:
type: array
examples:
- []
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 37de59fd-ab57-4351-b751-f42c1912b877
timestamp:
type: string
examples:
- '2026-08-05T16:18:38.848580Z'
examples:
-
status: SUCCESS
message: Success
data: []
errors: null
meta:
request_id: 37de59fd-ab57-4351-b751-f42c1912b877
timestamp: '2026-08-05T16:18:38.848580Z'
tags:
- 'Organization API'
post:
summary: 'Invite Team Member'
operationId: inviteTeamMember
description: 'Creates a pending team invitation and sends an accept-link email to the invitee.'
parameters: []
responses:
201:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- CREATED
message:
type: string
examples:
- 'Invitation sent.'
data:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-b25f-72cd-80f6-76a3fa80752a
email:
type: string
examples:
- kole.murray@example.com
name:
type:
- string
- 'null'
examples:
- null
role:
type: string
examples:
- member
preset_key:
type: string
examples:
- viewer
preset_label:
type: string
examples:
- Viewer
status:
type: string
examples:
- pending
invited_by_name:
type: string
examples:
- "Schuppe-D'Amore"
invited_at:
type: string
examples:
- '2026-08-05T16:19:07+00:00'
expires_at:
type: string
examples:
- '2026-08-12T16:19:07+00:00'
accepted_at:
type:
- string
- 'null'
examples:
- null
accepted_by_email:
type:
- string
- 'null'
examples:
- null
revoked_at:
type:
- string
- 'null'
examples:
- null
last_sent_at:
type: string
examples:
- '2026-08-05T16:19:07+00:00'
send_count:
type: integer
examples:
- 1
created_at:
type: string
examples:
- '2026-08-05T16:19:07+00:00'
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 07ca8112-6166-4ac4-b613-5485efe2470a
timestamp:
type: string
examples:
- '2026-08-05T16:19:07.496377Z'
examples:
-
status: CREATED
message: 'Invitation sent.'
data:
id: 019fd2b8-b25f-72cd-80f6-76a3fa80752a
email: kole.murray@example.com
name: null
role: member
preset_key: viewer
preset_label: Viewer
status: pending
invited_by_name: "Schuppe-D'Amore"
invited_at: '2026-08-05T16:19:07+00:00'
expires_at: '2026-08-12T16:19:07+00:00'
accepted_at: null
accepted_by_email: null
revoked_at: null
last_sent_at: '2026-08-05T16:19:07+00:00'
send_count: 1
created_at: '2026-08-05T16:19:07+00:00'
errors: null
meta:
request_id: 07ca8112-6166-4ac4-b613-5485efe2470a
timestamp: '2026-08-05T16:19:07.496377Z'
422:
description: 'Validation Error'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- VALIDATION_ERROR
message:
type: string
examples:
- 'The given data was invalid.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type: string
examples:
- email
message:
type: string
examples:
- 'The email field is required.'
examples:
-
-
field: email
message: 'The email field is required.'
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-04-02T12:00:00.000000Z'
examples:
-
status: VALIDATION_ERROR
message: 'The given data was invalid.'
data: null
errors:
-
field: email
message: 'The email field is required.'
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-04-02T12:00:00.000000Z'
tags:
- 'Organization API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
email:
type: string
description: 'Invitee email address (max 255).'
examples:
- member@example.com
name:
type:
- string
- 'null'
description: 'nullable Invitee display name (max 255).'
examples:
- 'Jane Smith'
preset_key:
type: string
description: 'ACL preset key for the invitee (e.g. viewer, manager, co-admin).'
examples:
- viewer
role:
type:
- string
- 'null'
description: 'nullable Legacy role override (member, manager). Derived from preset_key when omitted.'
examples:
- member
required:
- email
- preset_key
'/api/v1/org/team/invitations/{invitation}/resend':
post:
summary: 'Resend Team Invitation'
operationId: resendTeamInvitation
description: 'Re-sends the accept-link email for a pending invitation, rotating the token and resetting the expiry window.'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Invitation re-sent.'
data:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-affd-71e3-b323-f2b2d9a8c01b
email:
type: string
examples:
- zweite.kollegin@example.at
name:
type:
- string
- 'null'
examples:
- null
role:
type: string
examples:
- member
preset_key:
type: string
examples:
- viewer
preset_label:
type: string
examples:
- Viewer
status:
type: string
examples:
- pending
invited_by_name:
type: string
examples:
- Franecki-Christiansen
invited_at:
type: string
examples:
- '2026-08-05T16:19:06+00:00'
expires_at:
type: string
examples:
- '2026-08-12T16:19:06+00:00'
accepted_at:
type:
- string
- 'null'
examples:
- null
accepted_by_email:
type:
- string
- 'null'
examples:
- null
revoked_at:
type:
- string
- 'null'
examples:
- null
last_sent_at:
type: string
examples:
- '2026-08-05T16:19:06+00:00'
send_count:
type: integer
examples:
- 2
created_at:
type: string
examples:
- '2026-08-05T16:19:06+00:00'
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 619fc1d5-dc41-43a9-9212-7cc961686f00
timestamp:
type: string
examples:
- '2026-08-05T16:19:06.913816Z'
examples:
-
status: SUCCESS
message: 'Invitation re-sent.'
data:
id: 019fd2b8-affd-71e3-b323-f2b2d9a8c01b
email: zweite.kollegin@example.at
name: null
role: member
preset_key: viewer
preset_label: Viewer
status: pending
invited_by_name: Franecki-Christiansen
invited_at: '2026-08-05T16:19:06+00:00'
expires_at: '2026-08-12T16:19:06+00:00'
accepted_at: null
accepted_by_email: null
revoked_at: null
last_sent_at: '2026-08-05T16:19:06+00:00'
send_count: 2
created_at: '2026-08-05T16:19:06+00:00'
errors: null
meta:
request_id: 619fc1d5-dc41-43a9-9212-7cc961686f00
timestamp: '2026-08-05T16:19:06.913816Z'
404:
description: 'Invitation Not Found'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- NOT_FOUND
message:
type: string
examples:
- 'No query results for model.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-04-02T12:00:00.000000Z'
examples:
-
status: NOT_FOUND
message: 'No query results for model.'
data: null
errors: null
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-04-02T12:00:00.000000Z'
tags:
- 'Organization API'
parameters:
-
in: path
name: invitation
description: 'Invitation UUID.'
required: true
schema:
type: string
examples:
- 661f9511-f3ac-52e5-b827-557766551111
'/api/v1/org/team/invitations/{invitation}':
delete:
summary: 'Revoke Team Invitation'
operationId: revokeTeamInvitation
description: 'Revokes a pending team invitation. Accepted invitations cannot be revoked.'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Invitation revoked.'
data:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-affd-71e3-b323-f2b2d9a8c01b
email:
type: string
examples:
- zweite.kollegin@example.at
name:
type:
- string
- 'null'
examples:
- null
role:
type: string
examples:
- member
preset_key:
type: string
examples:
- viewer
preset_label:
type: string
examples:
- Viewer
status:
type: string
examples:
- revoked
invited_by_name:
type: string
examples:
- Franecki-Christiansen
invited_at:
type: string
examples:
- '2026-08-05T16:19:06+00:00'
expires_at:
type: string
examples:
- '2026-08-12T16:19:06+00:00'
accepted_at:
type:
- string
- 'null'
examples:
- null
accepted_by_email:
type:
- string
- 'null'
examples:
- null
revoked_at:
type: string
examples:
- '2026-08-05T16:19:06+00:00'
last_sent_at:
type: string
examples:
- '2026-08-05T16:19:06+00:00'
send_count:
type: integer
examples:
- 2
created_at:
type: string
examples:
- '2026-08-05T16:19:06+00:00'
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- af8be4ed-34a6-4610-a07f-38b7cc5318b3
timestamp:
type: string
examples:
- '2026-08-05T16:19:06.936143Z'
examples:
-
status: SUCCESS
message: 'Invitation revoked.'
data:
id: 019fd2b8-affd-71e3-b323-f2b2d9a8c01b
email: zweite.kollegin@example.at
name: null
role: member
preset_key: viewer
preset_label: Viewer
status: revoked
invited_by_name: Franecki-Christiansen
invited_at: '2026-08-05T16:19:06+00:00'
expires_at: '2026-08-12T16:19:06+00:00'
accepted_at: null
accepted_by_email: null
revoked_at: '2026-08-05T16:19:06+00:00'
last_sent_at: '2026-08-05T16:19:06+00:00'
send_count: 2
created_at: '2026-08-05T16:19:06+00:00'
errors: null
meta:
request_id: af8be4ed-34a6-4610-a07f-38b7cc5318b3
timestamp: '2026-08-05T16:19:06.936143Z'
404:
description: 'Invitation Not Found'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- NOT_FOUND
message:
type: string
examples:
- 'No query results for model.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-04-02T12:00:00.000000Z'
examples:
-
status: NOT_FOUND
message: 'No query results for model.'
data: null
errors: null
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-04-02T12:00:00.000000Z'
tags:
- 'Organization API'
parameters:
-
in: path
name: invitation
description: 'Invitation UUID.'
required: true
schema:
type: string
examples:
- 661f9511-f3ac-52e5-b827-557766551111
'/api/v1/org/team/members/{member_id}':
patch:
summary: 'Update Member Role'
operationId: updateMemberRole
description: "Updates a team member's role. Only the owning organisation may perform\nthis action. The Owner role cannot be assigned via this endpoint — it\nbelongs exclusively to the Organisation principal itself."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Member role updated.'
data:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-285e-707c-865a-ffbe4b08f730
user_id:
type: string
examples:
- 019fd2b8-285d-733a-9a39-9eff7782cebc
role:
type: string
examples:
- shift_manager
joined_at:
type: string
examples:
- '2026-08-05T16:18:32.000000Z'
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 112413aa-862d-4d0d-b901-32f1e694825b
timestamp:
type: string
examples:
- '2026-08-05T16:18:38.884959Z'
examples:
-
status: SUCCESS
message: 'Member role updated.'
data:
id: 019fd2b8-285e-707c-865a-ffbe4b08f730
user_id: 019fd2b8-285d-733a-9a39-9eff7782cebc
role: shift_manager
joined_at: '2026-08-05T16:18:32.000000Z'
errors: null
meta:
request_id: 112413aa-862d-4d0d-b901-32f1e694825b
timestamp: '2026-08-05T16:18:38.884959Z'
403:
description: ''
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- FORBIDDEN
message:
type: string
examples:
- 'This action is unauthorized.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type:
- string
- 'null'
examples:
- null
message:
type: string
examples:
- 'This action is unauthorized.'
examples:
-
-
field: null
message: 'This action is unauthorized.'
examples:
-
status: FORBIDDEN
message: 'This action is unauthorized.'
data: null
errors:
-
field: null
message: 'This action is unauthorized.'
422:
description: ''
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- VALIDATION_ERROR
message:
type: string
examples:
- 'Cannot assign the owner role via this endpoint.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type: string
examples:
- role
message:
type: string
examples:
- 'Cannot assign the owner role via this endpoint.'
examples:
-
-
field: role
message: 'Cannot assign the owner role via this endpoint.'
examples:
-
status: VALIDATION_ERROR
message: 'Cannot assign the owner role via this endpoint.'
data: null
errors:
-
field: role
message: 'Cannot assign the owner role via this endpoint.'
tags:
- 'Organization API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
role:
type: string
description: "The member's new role. Owner is refused here — ownership transfer is its own operation. Allowed: owner, admin, recruiter, shift_manager, finance."
examples:
- shift_manager
required:
- role
delete:
summary: 'Remove Team Member'
operationId: removeTeamMember
description: "Removes a member from the organisation's team. The primary admin\n(Owner role) cannot be removed via this endpoint — ownership transfer\nis a separate, deliberate operation."
parameters: []
responses:
204:
description: ''
content:
application/json:
schema:
type: object
properties: { }
examples:
- { }
403:
description: ''
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- FORBIDDEN
message:
type: string
examples:
- 'This action is unauthorized.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type:
- string
- 'null'
examples:
- null
message:
type: string
examples:
- 'This action is unauthorized.'
examples:
-
-
field: null
message: 'This action is unauthorized.'
examples:
-
status: FORBIDDEN
message: 'This action is unauthorized.'
data: null
errors:
-
field: null
message: 'This action is unauthorized.'
422:
description: ''
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- VALIDATION_ERROR
message:
type: string
examples:
- 'The organisation owner cannot be removed.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type:
- string
- 'null'
examples:
- null
message:
type: string
examples:
- 'The organisation owner cannot be removed.'
examples:
-
-
field: null
message: 'The organisation owner cannot be removed.'
examples:
-
status: VALIDATION_ERROR
message: 'The organisation owner cannot be removed.'
data: null
errors:
-
field: null
message: 'The organisation owner cannot be removed.'
tags:
- 'Organization API'
parameters:
-
in: path
name: member_id
description: 'The ID of the member.'
required: true
schema:
type: string
examples:
- architecto
'/api/v1/org/team/members/{member_id}/presets':
put:
summary: 'Update Member Presets'
operationId: updateMemberPresets
description: "Bulk-replaces the presets assigned to a team member. The request body\ncarries an array of preset keys; presets currently held but absent from\nthe array are revoked, presets present but not yet assigned are added.\nDiff and writes run inside a single transaction."
parameters: []
responses:
200:
description: Success
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Member presets updated.'
data:
type: object
properties:
member_id:
type: string
examples:
- uuid
presets:
type: array
items:
type: string
examples:
-
- manager
errors:
type:
- string
- 'null'
examples:
- null
examples:
-
status: SUCCESS
message: 'Member presets updated.'
data:
member_id: uuid
presets:
- manager
errors: null
403:
description: Forbidden
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- FORBIDDEN
message:
type: string
examples:
- 'This action is unauthorized.'
examples:
-
status: FORBIDDEN
message: 'This action is unauthorized.'
422:
description: 'Unknown preset'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- VALIDATION_ERROR
message:
type: string
examples:
- 'Validation failed.'
errors:
type: array
items:
type: object
properties:
field:
type: string
examples:
- presets.0
message:
type: string
examples:
- "Unknown preset 'foo'."
examples:
-
-
field: presets.0
message: "Unknown preset 'foo'."
examples:
-
status: VALIDATION_ERROR
message: 'Validation failed.'
errors:
-
field: presets.0
message: "Unknown preset 'foo'."
tags:
- 'Organization API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
presets:
type: array
description: 'List of preset keys to assign. Pass an empty array to revoke all.'
items:
type: string
examples:
-
- manager
- finance
required:
- presets
parameters:
-
in: path
name: member_id
description: 'The ID of the member.'
required: true
schema:
type: string
examples:
- architecto
'/api/v1/org/team/members/{member_id}/deactivate':
put:
summary: 'Deactivate Team Member'
operationId: deactivateTeamMember
description: "Soft-deactivates a team member: sets is_active = false and revokes all\nSanctum tokens so any in-flight sessions are immediately invalidated.\nThe member row is retained for audit and compliance purposes.\n\nGuards:\n- The target member must belong to the requesting actor's organisation.\n- A member cannot deactivate themselves.\n- The organisation owner cannot be deactivated via this endpoint."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Member deactivated.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- e0a4f5b9-485f-468f-a82e-e0e71a736f71
timestamp:
type: string
examples:
- '2026-08-05T16:18:38.928851Z'
examples:
-
status: SUCCESS
message: 'Member deactivated.'
data: null
errors: null
meta:
request_id: e0a4f5b9-485f-468f-a82e-e0e71a736f71
timestamp: '2026-08-05T16:18:38.928851Z'
403:
description: ''
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- FORBIDDEN
message:
type: string
examples:
- 'This action is unauthorized.'
examples:
-
status: FORBIDDEN
message: 'This action is unauthorized.'
422:
description: ''
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- VALIDATION_ERROR
message:
type: string
examples:
- 'You cannot deactivate yourself.'
examples:
-
status: VALIDATION_ERROR
message: 'You cannot deactivate yourself.'
tags:
- 'Organization API'
parameters:
-
in: path
name: member_id
description: 'The ID of the member.'
required: true
schema:
type: string
examples:
- architecto
'/api/v1/org/team/members/{member_id}/reactivate':
put:
summary: 'Reactivate Team Member'
operationId: reactivateTeamMember
description: "Re-enables a previously deactivated team member. The member regains\naccess to the organisation dashboard on their next login; existing\ntokens were revoked at deactivation time so a fresh login is required.\n\nGuards:\n- The target member must belong to the requesting actor's organisation."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Member reactivated.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 6022ea0d-33c3-46cd-a043-6dbbbc198b31
timestamp:
type: string
examples:
- '2026-08-05T16:18:38.951107Z'
examples:
-
status: SUCCESS
message: 'Member reactivated.'
data: null
errors: null
meta:
request_id: 6022ea0d-33c3-46cd-a043-6dbbbc198b31
timestamp: '2026-08-05T16:18:38.951107Z'
403:
description: ''
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- FORBIDDEN
message:
type: string
examples:
- 'This action is unauthorized.'
examples:
-
status: FORBIDDEN
message: 'This action is unauthorized.'
tags:
- 'Organization API'
parameters:
-
in: path
name: member_id
description: 'The ID of the member.'
required: true
schema:
type: string
examples:
- architecto
/api/v1/org/jobs:
get:
summary: 'List Organization Jobs'
operationId: listOrganizationJobs
description: 'List all jobs for the organization.'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
jobs:
type: array
items:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-28ee-71e0-b50d-2c303c17f728
title:
type: string
examples:
- 'Kindergarten Teacher'
category:
type: string
examples:
- warehouse
category_label:
type: string
examples:
- Warehouse
status:
type: string
examples:
- pending_review
status_label:
type: string
examples:
- 'In Prüfung'
status_color:
type: string
examples:
- yellow
location_city:
type: string
examples:
- Eldahaven
start_date:
type: string
examples:
- '2026-08-21'
end_date:
type: string
examples:
- '2026-09-15'
shift_start_time:
type: string
examples:
- '06:44:00'
shift_end_time:
type: string
examples:
- '06:04:00'
next_shift_date:
type:
- string
- 'null'
examples:
- null
total_vacancies:
type: integer
examples:
- 1
filled_vacancies:
type: integer
examples:
- 0
hourly_rate_gross:
type: number
examples:
- 18.4
applications_count:
type: integer
examples:
- 0
shifts_count:
type: integer
examples:
- 0
application_deadline:
type: string
examples:
- '2026-09-05 16:18'
published_at:
type:
- string
- 'null'
examples:
- null
created_at:
type: string
examples:
- '2026-08-05 16:18'
examples:
-
-
id: 019fd2b8-28ee-71e0-b50d-2c303c17f728
title: 'Kindergarten Teacher'
category: warehouse
category_label: Warehouse
status: pending_review
status_label: 'In Prüfung'
status_color: yellow
location_city: Eldahaven
start_date: '2026-08-21'
end_date: '2026-09-15'
shift_start_time: '06:44:00'
shift_end_time: '06:04:00'
next_shift_date: null
total_vacancies: 1
filled_vacancies: 0
hourly_rate_gross: 18.4
applications_count: 0
shifts_count: 0
application_deadline: '2026-09-05 16:18'
published_at: null
created_at: '2026-08-05 16:18'
-
id: 019fd2b8-28c4-732f-a94c-fb5a71a7d682
title: Accountant
category: office
category_label: Office
status: active
status_label: Aktiv
status_color: green
location_city: 'East Eliseo'
start_date: '2026-08-12'
end_date: '2026-08-19'
shift_start_time: '01:49:00'
shift_end_time: '18:57:00'
next_shift_date: '2026-08-05'
total_vacancies: 5
filled_vacancies: 0
hourly_rate_gross: 32.08
applications_count: 1
shifts_count: 1
application_deadline: '2026-09-05 16:18'
published_at: null
created_at: '2026-08-05 16:18'
-
id: 019fd2b8-28e8-73a4-94d6-5a423c21f064
title: 'Foundry Mold and Coremaker'
category: software
category_label: Software
status: draft
status_label: Entwurf
status_color: gray
location_city: 'South Zachery'
start_date: '2026-08-29'
end_date: '2026-09-25'
shift_start_time: '16:30:00'
shift_end_time: '14:33:00'
next_shift_date: null
total_vacancies: 10
filled_vacancies: 0
hourly_rate_gross: 29.86
applications_count: 0
shifts_count: 0
application_deadline: '2026-09-05 16:18'
published_at: null
created_at: '2026-08-05 16:18'
-
id: 019fd2b8-2705-73fd-a401-002956f1f401
title: 'Fahrer*in Zustelldienst Wien Nord'
category: logistics
category_label: Logistics
status: published
status_label: Aktiv
status_color: green
location_city: Wien
start_date: '2026-08-14'
end_date: '2026-08-15'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
next_shift_date: null
total_vacancies: 4
filled_vacancies: 0
hourly_rate_gross: 15
applications_count: 0
shifts_count: 0
application_deadline: '2026-08-12 00:00'
published_at: '2026-08-05 04:18'
created_at: '2026-08-05 16:18'
-
id: 019fd2b8-2700-724b-adc5-2be8957e0590
title: 'Kassierer*in Supermarkt Floridsdorf'
category: supermarket
category_label: Grocery
status: published
status_label: Aktiv
status_color: green
location_city: Wien
start_date: '2026-08-11'
end_date: '2026-08-12'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
next_shift_date: null
total_vacancies: 5
filled_vacancies: 0
hourly_rate_gross: 13.5
applications_count: 0
shifts_count: 0
application_deadline: '2026-08-09 00:00'
published_at: '2026-08-05 08:18'
created_at: '2026-08-05 16:18'
-
id: 019fd2b8-26fb-7142-b3a3-df10c3591584
title: 'Küchenhilfe Streetfood Festival Naschmarkt'
category: catering
category_label: Catering
status: published
status_label: Aktiv
status_color: green
location_city: Wien
start_date: '2026-08-13'
end_date: '2026-08-14'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
next_shift_date: null
total_vacancies: 6
filled_vacancies: 0
hourly_rate_gross: 13
applications_count: 0
shifts_count: 0
application_deadline: '2026-08-11 00:00'
published_at: '2026-08-05 13:18'
created_at: '2026-08-05 16:18'
-
id: 019fd2b8-270f-715d-a3a0-76c4c314e3ff
title: 'Verkäufer*in Elektronik Mediamarkt Vösendorf'
category: retail
category_label: Retail
status: published
status_label: Aktiv
status_color: green
location_city: Vösendorf
start_date: '2026-08-20'
end_date: '2026-08-21'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
next_shift_date: null
total_vacancies: 7
filled_vacancies: 0
hourly_rate_gross: 14
applications_count: 0
shifts_count: 0
application_deadline: '2026-08-18 00:00'
published_at: '2026-08-04 16:18'
created_at: '2026-08-05 16:18'
-
id: 019fd2b8-2599-7355-a7f1-dcb185b05faa
title: 'Rezeptionist*in Hotel Sacher'
category: hotel
category_label: Hospitality
status: published
status_label: Aktiv
status_color: green
location_city: Wien
start_date: '2026-08-17'
end_date: '2026-08-19'
shift_start_time: '09:00:00'
shift_end_time: '17:00:00'
next_shift_date: null
total_vacancies: 4
filled_vacancies: 0
hourly_rate_gross: 17.5
applications_count: 51
shifts_count: 0
application_deadline: '2026-08-14 00:00'
published_at: '2026-07-31 16:18'
created_at: '2026-08-05 16:18'
-
id: 019fd2b8-24b0-700a-ae2a-142f5e48aead
title: 'Lagerhelfer*in Logistikzentrum Inzersdorf'
category: warehouse
category_label: Warehouse
status: published
status_label: Aktiv
status_color: green
location_city: Wien
start_date: '2026-08-12'
end_date: '2026-08-14'
shift_start_time: '22:00:00'
shift_end_time: '06:00:00'
next_shift_date: null
total_vacancies: 15
filled_vacancies: 0
hourly_rate_gross: 14.8
applications_count: 29
shifts_count: 0
application_deadline: '2026-08-09 00:00'
published_at: '2026-08-01 16:18'
created_at: '2026-08-05 16:18'
-
id: 019fd2b8-270a-71f9-a13c-ef188105041c
title: 'Reinigungskraft Hotel Ibis Mariahilf'
category: cleaning
category_label: Cleaning
status: published
status_label: Aktiv
status_color: green
location_city: Wien
start_date: '2026-08-16'
end_date: '2026-08-17'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
next_shift_date: null
total_vacancies: 3
filled_vacancies: 0
hourly_rate_gross: 13.2
applications_count: 0
shifts_count: 0
application_deadline: '2026-08-14 00:00'
published_at: '2026-08-04 22:18'
created_at: '2026-08-05 16:18'
-
id: 019fd2b8-21c8-72cc-80b1-47fd13450522
title: 'Barkeeper*in Sommernacht Open Air'
category: gastro
category_label: Gastronomy
status: published
status_label: Aktiv
status_color: green
location_city: Wien
start_date: '2026-08-15'
end_date: '2026-08-17'
shift_start_time: '22:00:00'
shift_end_time: '06:00:00'
next_shift_date: null
total_vacancies: 8
filled_vacancies: 0
hourly_rate_gross: 16
applications_count: 38
shifts_count: 0
application_deadline: '2026-08-12 00:00'
published_at: '2026-07-31 16:18'
created_at: '2026-08-05 16:18'
-
id: 019fd2b8-22cf-71c5-8edd-5e3ce9d29e8b
title: 'Promoter*in Vienna Marathon'
category: event
category_label: Events
status: published
status_label: Aktiv
status_color: green
location_city: Wien
start_date: '2026-08-26'
end_date: '2026-08-28'
shift_start_time: '09:00:00'
shift_end_time: '17:00:00'
next_shift_date: null
total_vacancies: 20
filled_vacancies: 0
hourly_rate_gross: 13.5
applications_count: 62
shifts_count: 0
application_deadline: '2026-08-23 00:00'
published_at: '2026-07-31 16:18'
created_at: '2026-08-05 16:18'
-
id: 019fd2b8-1f86-7376-9a3a-c072ab5675cb
title: 'Service-Mitarbeiter*in Wiener Prater Festival'
category: gastro
category_label: Gastronomy
status: published
status_label: Aktiv
status_color: green
location_city: Wien
start_date: '2026-08-19'
end_date: '2026-08-21'
shift_start_time: '09:00:00'
shift_end_time: '17:00:00'
next_shift_date: null
total_vacancies: 12
filled_vacancies: 0
hourly_rate_gross: 15.5
applications_count: 45
shifts_count: 0
application_deadline: '2026-08-16 00:00'
published_at: '2026-07-31 16:18'
created_at: '2026-08-05 16:18'
-
id: 019fd2b8-1dcd-734a-a041-f809f58e95fb
title: 'IT Supportkraft Vertretung'
category: it_services
category_label: 'IT Services'
status: pending_review
status_label: 'In Prüfung'
status_color: yellow
location_city: Wien
start_date: '2026-08-20'
end_date: '2026-09-04'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
next_shift_date: null
total_vacancies: 2
filled_vacancies: 0
hourly_rate_gross: 22
applications_count: 0
shifts_count: 0
application_deadline: '2026-08-15 16:18'
published_at: null
created_at: '2026-08-05 16:18'
-
id: 019fd2b8-1dcb-73f4-9257-e7fa42fe8514
title: 'Sommerfest Catering'
category: catering
category_label: Catering
status: pending_review
status_label: 'In Prüfung'
status_color: yellow
location_city: Wien
start_date: '2026-09-24'
end_date: '2026-09-25'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
next_shift_date: null
total_vacancies: 12
filled_vacancies: 0
hourly_rate_gross: 15
applications_count: 0
shifts_count: 0
application_deadline: '2026-09-22 16:18'
published_at: null
created_at: '2026-08-05 16:18'
pagination:
type: object
properties:
current_page:
type: integer
examples:
- 1
last_page:
type: integer
examples:
- 2
per_page:
type: integer
examples:
- 15
total:
type: integer
examples:
- 18
examples:
-
status: SUCCESS
data:
jobs:
-
id: 019fd2b8-28ee-71e0-b50d-2c303c17f728
title: 'Kindergarten Teacher'
category: warehouse
category_label: Warehouse
status: pending_review
status_label: 'In Prüfung'
status_color: yellow
location_city: Eldahaven
start_date: '2026-08-21'
end_date: '2026-09-15'
shift_start_time: '06:44:00'
shift_end_time: '06:04:00'
next_shift_date: null
total_vacancies: 1
filled_vacancies: 0
hourly_rate_gross: 18.4
applications_count: 0
shifts_count: 0
application_deadline: '2026-09-05 16:18'
published_at: null
created_at: '2026-08-05 16:18'
-
id: 019fd2b8-28c4-732f-a94c-fb5a71a7d682
title: Accountant
category: office
category_label: Office
status: active
status_label: Aktiv
status_color: green
location_city: 'East Eliseo'
start_date: '2026-08-12'
end_date: '2026-08-19'
shift_start_time: '01:49:00'
shift_end_time: '18:57:00'
next_shift_date: '2026-08-05'
total_vacancies: 5
filled_vacancies: 0
hourly_rate_gross: 32.08
applications_count: 1
shifts_count: 1
application_deadline: '2026-09-05 16:18'
published_at: null
created_at: '2026-08-05 16:18'
-
id: 019fd2b8-28e8-73a4-94d6-5a423c21f064
title: 'Foundry Mold and Coremaker'
category: software
category_label: Software
status: draft
status_label: Entwurf
status_color: gray
location_city: 'South Zachery'
start_date: '2026-08-29'
end_date: '2026-09-25'
shift_start_time: '16:30:00'
shift_end_time: '14:33:00'
next_shift_date: null
total_vacancies: 10
filled_vacancies: 0
hourly_rate_gross: 29.86
applications_count: 0
shifts_count: 0
application_deadline: '2026-09-05 16:18'
published_at: null
created_at: '2026-08-05 16:18'
-
id: 019fd2b8-2705-73fd-a401-002956f1f401
title: 'Fahrer*in Zustelldienst Wien Nord'
category: logistics
category_label: Logistics
status: published
status_label: Aktiv
status_color: green
location_city: Wien
start_date: '2026-08-14'
end_date: '2026-08-15'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
next_shift_date: null
total_vacancies: 4
filled_vacancies: 0
hourly_rate_gross: 15
applications_count: 0
shifts_count: 0
application_deadline: '2026-08-12 00:00'
published_at: '2026-08-05 04:18'
created_at: '2026-08-05 16:18'
-
id: 019fd2b8-2700-724b-adc5-2be8957e0590
title: 'Kassierer*in Supermarkt Floridsdorf'
category: supermarket
category_label: Grocery
status: published
status_label: Aktiv
status_color: green
location_city: Wien
start_date: '2026-08-11'
end_date: '2026-08-12'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
next_shift_date: null
total_vacancies: 5
filled_vacancies: 0
hourly_rate_gross: 13.5
applications_count: 0
shifts_count: 0
application_deadline: '2026-08-09 00:00'
published_at: '2026-08-05 08:18'
created_at: '2026-08-05 16:18'
-
id: 019fd2b8-26fb-7142-b3a3-df10c3591584
title: 'Küchenhilfe Streetfood Festival Naschmarkt'
category: catering
category_label: Catering
status: published
status_label: Aktiv
status_color: green
location_city: Wien
start_date: '2026-08-13'
end_date: '2026-08-14'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
next_shift_date: null
total_vacancies: 6
filled_vacancies: 0
hourly_rate_gross: 13
applications_count: 0
shifts_count: 0
application_deadline: '2026-08-11 00:00'
published_at: '2026-08-05 13:18'
created_at: '2026-08-05 16:18'
-
id: 019fd2b8-270f-715d-a3a0-76c4c314e3ff
title: 'Verkäufer*in Elektronik Mediamarkt Vösendorf'
category: retail
category_label: Retail
status: published
status_label: Aktiv
status_color: green
location_city: Vösendorf
start_date: '2026-08-20'
end_date: '2026-08-21'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
next_shift_date: null
total_vacancies: 7
filled_vacancies: 0
hourly_rate_gross: 14
applications_count: 0
shifts_count: 0
application_deadline: '2026-08-18 00:00'
published_at: '2026-08-04 16:18'
created_at: '2026-08-05 16:18'
-
id: 019fd2b8-2599-7355-a7f1-dcb185b05faa
title: 'Rezeptionist*in Hotel Sacher'
category: hotel
category_label: Hospitality
status: published
status_label: Aktiv
status_color: green
location_city: Wien
start_date: '2026-08-17'
end_date: '2026-08-19'
shift_start_time: '09:00:00'
shift_end_time: '17:00:00'
next_shift_date: null
total_vacancies: 4
filled_vacancies: 0
hourly_rate_gross: 17.5
applications_count: 51
shifts_count: 0
application_deadline: '2026-08-14 00:00'
published_at: '2026-07-31 16:18'
created_at: '2026-08-05 16:18'
-
id: 019fd2b8-24b0-700a-ae2a-142f5e48aead
title: 'Lagerhelfer*in Logistikzentrum Inzersdorf'
category: warehouse
category_label: Warehouse
status: published
status_label: Aktiv
status_color: green
location_city: Wien
start_date: '2026-08-12'
end_date: '2026-08-14'
shift_start_time: '22:00:00'
shift_end_time: '06:00:00'
next_shift_date: null
total_vacancies: 15
filled_vacancies: 0
hourly_rate_gross: 14.8
applications_count: 29
shifts_count: 0
application_deadline: '2026-08-09 00:00'
published_at: '2026-08-01 16:18'
created_at: '2026-08-05 16:18'
-
id: 019fd2b8-270a-71f9-a13c-ef188105041c
title: 'Reinigungskraft Hotel Ibis Mariahilf'
category: cleaning
category_label: Cleaning
status: published
status_label: Aktiv
status_color: green
location_city: Wien
start_date: '2026-08-16'
end_date: '2026-08-17'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
next_shift_date: null
total_vacancies: 3
filled_vacancies: 0
hourly_rate_gross: 13.2
applications_count: 0
shifts_count: 0
application_deadline: '2026-08-14 00:00'
published_at: '2026-08-04 22:18'
created_at: '2026-08-05 16:18'
-
id: 019fd2b8-21c8-72cc-80b1-47fd13450522
title: 'Barkeeper*in Sommernacht Open Air'
category: gastro
category_label: Gastronomy
status: published
status_label: Aktiv
status_color: green
location_city: Wien
start_date: '2026-08-15'
end_date: '2026-08-17'
shift_start_time: '22:00:00'
shift_end_time: '06:00:00'
next_shift_date: null
total_vacancies: 8
filled_vacancies: 0
hourly_rate_gross: 16
applications_count: 38
shifts_count: 0
application_deadline: '2026-08-12 00:00'
published_at: '2026-07-31 16:18'
created_at: '2026-08-05 16:18'
-
id: 019fd2b8-22cf-71c5-8edd-5e3ce9d29e8b
title: 'Promoter*in Vienna Marathon'
category: event
category_label: Events
status: published
status_label: Aktiv
status_color: green
location_city: Wien
start_date: '2026-08-26'
end_date: '2026-08-28'
shift_start_time: '09:00:00'
shift_end_time: '17:00:00'
next_shift_date: null
total_vacancies: 20
filled_vacancies: 0
hourly_rate_gross: 13.5
applications_count: 62
shifts_count: 0
application_deadline: '2026-08-23 00:00'
published_at: '2026-07-31 16:18'
created_at: '2026-08-05 16:18'
-
id: 019fd2b8-1f86-7376-9a3a-c072ab5675cb
title: 'Service-Mitarbeiter*in Wiener Prater Festival'
category: gastro
category_label: Gastronomy
status: published
status_label: Aktiv
status_color: green
location_city: Wien
start_date: '2026-08-19'
end_date: '2026-08-21'
shift_start_time: '09:00:00'
shift_end_time: '17:00:00'
next_shift_date: null
total_vacancies: 12
filled_vacancies: 0
hourly_rate_gross: 15.5
applications_count: 45
shifts_count: 0
application_deadline: '2026-08-16 00:00'
published_at: '2026-07-31 16:18'
created_at: '2026-08-05 16:18'
-
id: 019fd2b8-1dcd-734a-a041-f809f58e95fb
title: 'IT Supportkraft Vertretung'
category: it_services
category_label: 'IT Services'
status: pending_review
status_label: 'In Prüfung'
status_color: yellow
location_city: Wien
start_date: '2026-08-20'
end_date: '2026-09-04'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
next_shift_date: null
total_vacancies: 2
filled_vacancies: 0
hourly_rate_gross: 22
applications_count: 0
shifts_count: 0
application_deadline: '2026-08-15 16:18'
published_at: null
created_at: '2026-08-05 16:18'
-
id: 019fd2b8-1dcb-73f4-9257-e7fa42fe8514
title: 'Sommerfest Catering'
category: catering
category_label: Catering
status: pending_review
status_label: 'In Prüfung'
status_color: yellow
location_city: Wien
start_date: '2026-09-24'
end_date: '2026-09-25'
shift_start_time: '08:00:00'
shift_end_time: '16:00:00'
next_shift_date: null
total_vacancies: 12
filled_vacancies: 0
hourly_rate_gross: 15
applications_count: 0
shifts_count: 0
application_deadline: '2026-09-22 16:18'
published_at: null
created_at: '2026-08-05 16:18'
pagination:
current_page: 1
last_page: 2
per_page: 15
total: 18
tags:
- 'Organization API'
post:
summary: 'Create Job'
operationId: createJob
description: 'Create a new job listing for the organization.'
parameters: []
responses:
201:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'The job has been created successfully.'
data:
type: object
properties:
job:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-6bb5-7113-b62c-7434d5f44733
title:
type: string
examples:
- 'Lagermitarbeiter (m/w/d)'
status:
type: string
examples:
- draft
status_label:
type: string
examples:
- Entwurf
created_at:
type: string
examples:
- '2026-08-05 16:18:49'
examples:
-
status: SUCCESS
message: 'The job has been created successfully.'
data:
job:
id: 019fd2b8-6bb5-7113-b62c-7434d5f44733
title: 'Lagermitarbeiter (m/w/d)'
status: draft
status_label: Entwurf
created_at: '2026-08-05 16:18:49'
tags:
- 'Organization API'
/api/v1/org/jobs/categories:
get:
summary: 'List Organization Job Categories'
operationId: listOrganizationJobCategories
description: "List the active job categories available to an organization when creating a\njob or filtering the jobs list. Returns a flat, ordered list keyed by slug,\neach carrying its authoritative KV minimum hourly wage (LSD-BG equal\ntreatment) so the portal validates pay against the same floor the backend\nenforces at submit."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
categories:
type: array
items:
type: object
properties:
code:
type: string
examples:
- gastro
label:
type: string
examples:
- Gastronomy
icon:
type: string
examples:
- utensils
min_hourly_cents:
type:
- string
- 'null'
examples:
- null
rate_source:
type:
- string
- 'null'
examples:
- null
examples:
-
-
code: gastro
label: Gastronomy
icon: utensils
min_hourly_cents: null
rate_source: null
-
code: hotel
label: Hospitality
icon: hotel
min_hourly_cents: null
rate_source: null
-
code: food_service
label: 'Food Service'
icon: utensils
min_hourly_cents: null
rate_source: null
-
code: catering
label: Catering
icon: utensils
min_hourly_cents: null
rate_source: null
-
code: retail
label: Retail
icon: shopping-cart
min_hourly_cents: null
rate_source: null
-
code: supermarket
label: Grocery
icon: shopping-cart
min_hourly_cents: null
rate_source: null
-
code: pharmacy
label: Pharmacy
icon: heart-pulse
min_hourly_cents: null
rate_source: null
-
code: production
label: Production
icon: industry
min_hourly_cents: null
rate_source: null
-
code: warehouse
label: Warehouse
icon: industry
min_hourly_cents: null
rate_source: null
-
code: logistics
label: Logistics
icon: truck
min_hourly_cents: null
rate_source: null
-
code: manufacturing
label: Manufacturing
icon: industry
min_hourly_cents: null
rate_source: null
-
code: transportation
label: Transportation
icon: truck
min_hourly_cents: null
rate_source: null
-
code: event
label: Events
icon: calendar-star
min_hourly_cents: null
rate_source: null
-
code: security
label: Security
icon: shield
min_hourly_cents: null
rate_source: null
-
code: office
label: Office
icon: briefcase
min_hourly_cents: null
rate_source: null
-
code: reception
label: Reception
icon: briefcase
min_hourly_cents: null
rate_source: null
-
code: call_center
label: 'Call Center'
icon: briefcase
min_hourly_cents: null
rate_source: null
-
code: customer_service
label: 'Customer Service'
icon: briefcase
min_hourly_cents: null
rate_source: null
-
code: software
label: Software
icon: code
min_hourly_cents: null
rate_source: null
-
code: it_services
label: 'IT Services'
icon: code
min_hourly_cents: null
rate_source: null
-
code: cleaning
label: Cleaning
icon: broom
min_hourly_cents: null
rate_source: null
-
code: facility
label: 'Facility Management'
icon: broom
min_hourly_cents: null
rate_source: null
-
code: care
label: Care
icon: heart-pulse
min_hourly_cents: null
rate_source: null
-
code: healthcare
label: Healthcare
icon: heart-pulse
min_hourly_cents: null
rate_source: null
-
code: construction
label: Construction
icon: building
min_hourly_cents: null
rate_source: null
-
code: real_estate
label: 'Real Estate'
icon: building
min_hourly_cents: null
rate_source: null
-
code: graphic_design
label: 'Graphic Design'
icon: palette
min_hourly_cents: null
rate_source: null
-
code: media
label: Media
icon: palette
min_hourly_cents: null
rate_source: null
-
code: education
label: Education
icon: graduation-cap
min_hourly_cents: null
rate_source: null
-
code: finance
label: Finance
icon: chart-line
min_hourly_cents: null
rate_source: null
-
code: agriculture
label: Agriculture
icon: leaf
min_hourly_cents: null
rate_source: null
-
code: other
label: Other
icon: ellipsis
min_hourly_cents: null
rate_source: null
examples:
-
status: SUCCESS
data:
categories:
-
code: gastro
label: Gastronomy
icon: utensils
min_hourly_cents: null
rate_source: null
-
code: hotel
label: Hospitality
icon: hotel
min_hourly_cents: null
rate_source: null
-
code: food_service
label: 'Food Service'
icon: utensils
min_hourly_cents: null
rate_source: null
-
code: catering
label: Catering
icon: utensils
min_hourly_cents: null
rate_source: null
-
code: retail
label: Retail
icon: shopping-cart
min_hourly_cents: null
rate_source: null
-
code: supermarket
label: Grocery
icon: shopping-cart
min_hourly_cents: null
rate_source: null
-
code: pharmacy
label: Pharmacy
icon: heart-pulse
min_hourly_cents: null
rate_source: null
-
code: production
label: Production
icon: industry
min_hourly_cents: null
rate_source: null
-
code: warehouse
label: Warehouse
icon: industry
min_hourly_cents: null
rate_source: null
-
code: logistics
label: Logistics
icon: truck
min_hourly_cents: null
rate_source: null
-
code: manufacturing
label: Manufacturing
icon: industry
min_hourly_cents: null
rate_source: null
-
code: transportation
label: Transportation
icon: truck
min_hourly_cents: null
rate_source: null
-
code: event
label: Events
icon: calendar-star
min_hourly_cents: null
rate_source: null
-
code: security
label: Security
icon: shield
min_hourly_cents: null
rate_source: null
-
code: office
label: Office
icon: briefcase
min_hourly_cents: null
rate_source: null
-
code: reception
label: Reception
icon: briefcase
min_hourly_cents: null
rate_source: null
-
code: call_center
label: 'Call Center'
icon: briefcase
min_hourly_cents: null
rate_source: null
-
code: customer_service
label: 'Customer Service'
icon: briefcase
min_hourly_cents: null
rate_source: null
-
code: software
label: Software
icon: code
min_hourly_cents: null
rate_source: null
-
code: it_services
label: 'IT Services'
icon: code
min_hourly_cents: null
rate_source: null
-
code: cleaning
label: Cleaning
icon: broom
min_hourly_cents: null
rate_source: null
-
code: facility
label: 'Facility Management'
icon: broom
min_hourly_cents: null
rate_source: null
-
code: care
label: Care
icon: heart-pulse
min_hourly_cents: null
rate_source: null
-
code: healthcare
label: Healthcare
icon: heart-pulse
min_hourly_cents: null
rate_source: null
-
code: construction
label: Construction
icon: building
min_hourly_cents: null
rate_source: null
-
code: real_estate
label: 'Real Estate'
icon: building
min_hourly_cents: null
rate_source: null
-
code: graphic_design
label: 'Graphic Design'
icon: palette
min_hourly_cents: null
rate_source: null
-
code: media
label: Media
icon: palette
min_hourly_cents: null
rate_source: null
-
code: education
label: Education
icon: graduation-cap
min_hourly_cents: null
rate_source: null
-
code: finance
label: Finance
icon: chart-line
min_hourly_cents: null
rate_source: null
-
code: agriculture
label: Agriculture
icon: leaf
min_hourly_cents: null
rate_source: null
-
code: other
label: Other
icon: ellipsis
min_hourly_cents: null
rate_source: null
tags:
- 'Organization API'
/api/v1/org/jobs/document-types:
get:
summary: 'List Job Document Types'
operationId: listJobDocumentTypes
description: "The catalog of worker document types a company can require as an application\nprerequisite (e.g. work permit, driver licence). Only types an admin has left\ncompany-selectable are offered. Backs the required-documents multiselect on\nthe create/edit job form."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
document_types:
type: array
items:
type: object
properties:
code:
type: string
examples:
- passport
label:
type: string
examples:
- Passport
examples:
-
-
code: passport
label: Passport
-
code: id_card
label: 'ID card'
-
code: driver_license
label: "Driver's licence"
-
code: work_permit
label: 'Work permit'
-
code: residence_permit
label: 'Residence permit'
-
code: rot_weiss_rot_karte
label: 'Rot-Weiß-Rot card'
-
code: blue_card
label: 'EU Blue Card'
-
code: bank_statement
label: 'Bank statement'
-
code: proof_of_address
label: 'Proof of address'
-
code: social_insurance_card
label: 'Social insurance record'
-
code: tax_document
label: 'Tax document'
-
code: certification
label: Certification
-
code: health_certificate
label: 'Health certificate'
-
code: criminal_record_check
label: 'Criminal record check'
-
code: other
label: Other
examples:
-
status: SUCCESS
data:
document_types:
-
code: passport
label: Passport
-
code: id_card
label: 'ID card'
-
code: driver_license
label: "Driver's licence"
-
code: work_permit
label: 'Work permit'
-
code: residence_permit
label: 'Residence permit'
-
code: rot_weiss_rot_karte
label: 'Rot-Weiß-Rot card'
-
code: blue_card
label: 'EU Blue Card'
-
code: bank_statement
label: 'Bank statement'
-
code: proof_of_address
label: 'Proof of address'
-
code: social_insurance_card
label: 'Social insurance record'
-
code: tax_document
label: 'Tax document'
-
code: certification
label: Certification
-
code: health_certificate
label: 'Health certificate'
-
code: criminal_record_check
label: 'Criminal record check'
-
code: other
label: Other
tags:
- 'Organization API'
'/api/v1/org/jobs/{jobId}':
get:
summary: 'Get Organization Job'
operationId: getOrganizationJob
description: 'Get job details for the organization.'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
job:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-28c4-732f-a94c-fb5a71a7d682
title:
type: string
examples:
- Accountant
description:
type: string
examples:
- 'Ut nostrum rerum ut alias quia libero excepturi. Voluptatum et aut non quia quisquam molestias. Perferendis qui hic unde.'
category:
type: string
examples:
- office
category_label:
type: string
examples:
- Office
status:
type: string
examples:
- active
status_label:
type: string
examples:
- Aktiv
status_color:
type: string
examples:
- green
shift_type:
type: string
examples:
- night
shift_type_label:
type: string
examples:
- Nachtschicht
location:
type: object
properties:
name:
type: string
examples:
- 'Barrows, Christiansen and Jones'
address:
type: string
examples:
- '586 Tremaine Row'
city:
type: string
examples:
- 'East Eliseo'
postal_code:
type: string
examples:
- 10547-3697
lat:
type: number
examples:
- 46.931383
lng:
type: number
examples:
- 11.998284
schedule:
type: object
properties:
start_date:
type: string
examples:
- '2026-08-12'
end_date:
type: string
examples:
- '2026-08-19'
shift_start_time:
type: string
examples:
- '01:49:00'
shift_end_time:
type: string
examples:
- '18:57:00'
vacancies:
type: object
properties:
total:
type: integer
examples:
- 5
filled:
type: integer
examples:
- 0
available:
type: integer
examples:
- 5
compensation:
type: object
properties:
hourly_rate_gross:
type: number
examples:
- 32.08
supplements:
type: object
properties:
night:
type: number
examples:
- 0.7
weekend:
type: number
examples:
- 3.86
estimated_total_gross:
type: integer
examples:
- 0
requirements:
type: object
properties:
qualifications:
type: array
examples:
- []
dress_code:
type: string
examples:
- 'Tempore necessitatibus quia illo suscipit.'
equipment_provided:
type: string
examples:
- 'Adipisci fugiat doloremque atque consectetur necessitatibus sunt cumque.'
contact:
type: object
properties:
parking_info:
type:
- string
- 'null'
examples:
- null
special_instructions:
type:
- string
- 'null'
examples:
- null
deadlines:
type: object
properties:
application_deadline:
type: string
examples:
- '2026-09-05 16:18'
confirmation_deadline:
type: string
examples:
- '2026-08-16 10:20'
sign_window_hours:
type: integer
examples:
- 24
statistics:
type: object
properties:
applications_count:
type: integer
examples:
- 1
shifts_count:
type: integer
examples:
- 1
assignment:
type: object
properties:
method:
type: string
examples:
- manual
auto_reject_after_hours:
type:
- string
- 'null'
examples:
- null
required_documents:
type: array
items:
type: object
properties:
code:
type: string
examples:
- passport
name:
type: string
examples:
- Reisepass
examples:
-
-
code: passport
name: Reisepass
-
code: driver_license
name: Führerschein
custom_document_requests:
type: array
examples:
- []
planned_shifts:
type: array
items:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-28d5-7103-b951-9f6ff1d94556
shift_date:
type: string
examples:
- '2026-08-05'
start_time:
type: string
examples:
- '08:00'
end_time:
type: string
examples:
- '16:00'
break_minutes:
type: integer
examples:
- 30
workers_needed:
type: integer
examples:
- 2
shift_manager_member_id:
type:
- string
- 'null'
examples:
- null
shift_manager_name:
type:
- string
- 'null'
examples:
- null
notes:
type:
- string
- 'null'
examples:
- null
dress_code:
type:
- string
- 'null'
examples:
- null
contact_person_name:
type:
- string
- 'null'
examples:
- null
contact_person_phone:
type:
- string
- 'null'
examples:
- null
meeting_point:
type:
- string
- 'null'
examples:
- null
geofence:
type:
- string
- 'null'
examples:
- null
application_deadline:
type:
- string
- 'null'
examples:
- null
examples:
-
-
id: 019fd2b8-28d5-7103-b951-9f6ff1d94556
shift_date: '2026-08-05'
start_time: '08:00'
end_time: '16:00'
break_minutes: 30
workers_needed: 2
shift_manager_member_id: null
shift_manager_name: null
notes: null
dress_code: null
contact_person_name: null
contact_person_phone: null
meeting_point: null
geofence: null
application_deadline: null
review:
type: object
properties:
submitted_at:
type:
- string
- 'null'
examples:
- null
reviewed_at:
type:
- string
- 'null'
examples:
- null
rejection_note:
type:
- string
- 'null'
examples:
- null
timestamps:
type: object
properties:
published_at:
type:
- string
- 'null'
examples:
- null
filled_at:
type:
- string
- 'null'
examples:
- null
cancelled_at:
type:
- string
- 'null'
examples:
- null
cancellation_reason:
type:
- string
- 'null'
examples:
- null
created_at:
type: string
examples:
- '2026-08-05 16:18'
updated_at:
type: string
examples:
- '2026-08-05 16:18'
examples:
-
status: SUCCESS
data:
job:
id: 019fd2b8-28c4-732f-a94c-fb5a71a7d682
title: Accountant
description: 'Ut nostrum rerum ut alias quia libero excepturi. Voluptatum et aut non quia quisquam molestias. Perferendis qui hic unde.'
category: office
category_label: Office
status: active
status_label: Aktiv
status_color: green
shift_type: night
shift_type_label: Nachtschicht
location:
name: 'Barrows, Christiansen and Jones'
address: '586 Tremaine Row'
city: 'East Eliseo'
postal_code: 10547-3697
lat: 46.931383
lng: 11.998284
schedule:
start_date: '2026-08-12'
end_date: '2026-08-19'
shift_start_time: '01:49:00'
shift_end_time: '18:57:00'
vacancies:
total: 5
filled: 0
available: 5
compensation:
hourly_rate_gross: 32.08
supplements:
night: 0.7
weekend: 3.86
estimated_total_gross: 0
requirements:
qualifications: []
dress_code: 'Tempore necessitatibus quia illo suscipit.'
equipment_provided: 'Adipisci fugiat doloremque atque consectetur necessitatibus sunt cumque.'
contact:
parking_info: null
special_instructions: null
deadlines:
application_deadline: '2026-09-05 16:18'
confirmation_deadline: '2026-08-16 10:20'
sign_window_hours: 24
statistics:
applications_count: 1
shifts_count: 1
assignment:
method: manual
auto_reject_after_hours: null
required_documents:
-
code: passport
name: Reisepass
-
code: driver_license
name: Führerschein
custom_document_requests: []
planned_shifts:
-
id: 019fd2b8-28d5-7103-b951-9f6ff1d94556
shift_date: '2026-08-05'
start_time: '08:00'
end_time: '16:00'
break_minutes: 30
workers_needed: 2
shift_manager_member_id: null
shift_manager_name: null
notes: null
dress_code: null
contact_person_name: null
contact_person_phone: null
meeting_point: null
geofence: null
application_deadline: null
review:
submitted_at: null
reviewed_at: null
rejection_note: null
timestamps:
published_at: null
filled_at: null
cancelled_at: null
cancellation_reason: null
created_at: '2026-08-05 16:18'
updated_at: '2026-08-05 16:18'
tags:
- 'Organization API'
put:
summary: 'Update a draft job listing for the organization.'
operationId: updateADraftJobListingForTheOrganization
description: ''
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'The job has been updated successfully.'
data:
type: object
properties:
job:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-6bb5-7113-b62c-7434d5f44733
title:
type: string
examples:
- 'Lagermitarbeiter Nachtschicht (m/w/d)'
description:
type: string
examples:
- 'Kommissionieren und Verräumen im Zentrallager.'
location:
type: object
properties:
name:
type: string
examples:
- 'Zentrallager Wien'
address:
type:
- string
- 'null'
examples:
- null
city:
type: string
examples:
- Wien
postal_code:
type:
- string
- 'null'
examples:
- null
lat:
type:
- string
- 'null'
examples:
- null
lng:
type:
- string
- 'null'
examples:
- null
compensation:
type: object
properties:
hourly_rate_gross:
type: number
examples:
- 15.5
estimated_total_gross:
type: integer
examples:
- 372
timestamps:
type: object
properties:
updated_at:
type: string
examples:
- '2026-08-05 16:18'
examples:
-
status: SUCCESS
message: 'The job has been updated successfully.'
data:
job:
id: 019fd2b8-6bb5-7113-b62c-7434d5f44733
title: 'Lagermitarbeiter Nachtschicht (m/w/d)'
description: 'Kommissionieren und Verräumen im Zentrallager.'
location:
name: 'Zentrallager Wien'
address: null
city: Wien
postal_code: null
lat: null
lng: null
compensation:
hourly_rate_gross: 15.5
estimated_total_gross: 372
timestamps:
updated_at: '2026-08-05 16:18'
404:
description: 'Job Not Found'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- NOT_FOUND
message:
type: string
examples:
- 'Job not found.'
examples:
-
status: NOT_FOUND
message: 'Job not found.'
422:
description: ''
content:
application/json:
schema:
oneOf:
-
description: 'Job Not Editable'
type: object
properties:
status:
type: string
examples:
- INVALID_OPERATION
message:
type: string
examples:
- 'Only draft jobs can be edited.'
examples:
-
status: INVALID_OPERATION
message: 'Only draft jobs can be edited.'
-
description: 'Validation Error'
type: object
properties:
status:
type: string
examples:
- ERROR
message:
type: string
examples:
- 'The title field must not be greater than 200 characters.'
errors:
type: object
properties:
title:
type: array
items:
type: string
examples:
-
- 'The title field must not be greater than 200 characters.'
examples:
-
status: ERROR
message: 'The title field must not be greater than 200 characters.'
errors:
title:
- 'The title field must not be greater than 200 characters.'
tags:
- 'Company - Jobs'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
title:
type: string
description: 'optional Updated job title. Max 200 characters.'
examples:
- 'Eventhelfer Messe Wien'
description:
type: string
description: 'optional nullable Updated description. Max 5000 characters.'
examples:
- 'Aufbau und Betreuung eines Messestands.'
hourly_rate_gross:
type: numeric
description: 'optional Gross hourly rate (minimum 12.00 EUR).'
examples:
- '14.50'
location_name:
type: string
description: 'optional Location display name.'
examples:
- 'Messe Wien'
location_address:
type: string
description: 'optional nullable Street address.'
examples:
- 'Messeplatz 1'
location_city:
type: string
description: 'optional nullable City.'
examples:
- Wien
location_postal_code:
type: string
description: 'optional nullable Postal code.'
examples:
- '1020'
location_lat:
type: numeric
description: 'optional nullable Latitude (-90 to 90).'
examples:
- '48.2208'
location_lng:
type: numeric
description: 'optional nullable Longitude (-180 to 180).'
examples:
- '16.4108'
parameters:
-
in: path
name: jobId
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
'/api/v1/org/jobs/{jobId}/submit':
post:
summary: 'Submit Job For Review'
operationId: submitJobForReview
description: "Submit a draft (or previously rejected) job for admin review. Funds for\nevery shift + promotion are blocked from the wallet at submit time, so an\nadmin only ever reviews a job the company can afford. The job then waits in\n`pending_review` until an admin approves (→ active) or rejects it."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'The job has been submitted for admin review.'
data:
type: object
properties:
job:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-6bb5-7113-b62c-7434d5f44733
status:
type: string
examples:
- pending_review
status_label:
type: string
examples:
- 'In Prüfung'
submitted_at:
type: string
examples:
- '2026-08-05 16:18'
compliance_flags:
type: array
examples:
- []
examples:
-
status: SUCCESS
message: 'The job has been submitted for admin review.'
data:
job:
id: 019fd2b8-6bb5-7113-b62c-7434d5f44733
status: pending_review
status_label: 'In Prüfung'
submitted_at: '2026-08-05 16:18'
compliance_flags: []
tags:
- 'Organization API'
parameters:
-
in: path
name: jobId
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
'/api/v1/org/jobs/{jobId}/close':
post:
summary: 'Close Job'
operationId: closeJob
description: 'Close a job (cancel or mark as filled).'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'The job has been marked as filled.'
data:
type: object
properties:
job:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-28c4-732f-a94c-fb5a71a7d682
status:
type: string
examples:
- filled
status_label:
type: string
examples:
- Besetzt
examples:
-
status: SUCCESS
message: 'The job has been marked as filled.'
data:
job:
id: 019fd2b8-28c4-732f-a94c-fb5a71a7d682
status: filled
status_label: Besetzt
tags:
- 'Organization API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
reason:
type: string
description: 'Allowed: filled, cancelled.'
examples:
- filled
cancellation_reason:
type: string
description: ''
examples:
- 'Krankheitsbedingt kurzfristig abgesagt.'
required:
- reason
- cancellation_reason
parameters:
-
in: path
name: jobId
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
'/api/v1/org/jobs/{jobId}/applicants':
get:
summary: 'List Applicants'
operationId: listApplicants
description: 'List all applicants for a specific job.'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
applicants:
type: array
items:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-76c6-72bb-a2d9-98ed4934fb02
status:
type: string
examples:
- pending
status_label:
type: string
examples:
- Eingereicht
applied_at:
type: string
examples:
- '2026-08-05 16:18'
has_scheduling_conflict:
type: boolean
examples:
- false
acknowledged_conflict:
type: boolean
examples:
- false
shortlisted_at:
type:
- string
- 'null'
examples:
- null
selected_at:
type:
- string
- 'null'
examples:
- null
rejected_at:
type:
- string
- 'null'
examples:
- null
notes:
type:
- string
- 'null'
examples:
- null
match_score:
type: integer
examples:
- 78
employee:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-7352-72bc-9514-ac7713e5c225
name:
type: string
examples:
- 'Fae G.'
identity_revealed:
type: boolean
examples:
- false
email:
type:
- string
- 'null'
examples:
- null
phone:
type:
- string
- 'null'
examples:
- null
profile:
type: object
properties:
nationality:
type: string
examples:
- AT
city:
type: string
examples:
- 'North Asa'
profile_completion_percentage:
type: integer
examples:
- 86
avg_rating:
type:
- string
- 'null'
examples:
- null
total_shifts_completed:
type: integer
examples:
- 0
examples:
-
-
id: 019fd2b8-76c6-72bb-a2d9-98ed4934fb02
status: pending
status_label: Eingereicht
applied_at: '2026-08-05 16:18'
has_scheduling_conflict: false
acknowledged_conflict: false
shortlisted_at: null
selected_at: null
rejected_at: null
notes: null
match_score: 78
employee:
id: 019fd2b8-7352-72bc-9514-ac7713e5c225
name: 'Fae G.'
identity_revealed: false
email: null
phone: null
profile:
nationality: AT
city: 'North Asa'
profile_completion_percentage: 86
avg_rating: null
total_shifts_completed: 0
summary:
type: object
properties:
total:
type: integer
examples:
- 1
by_status:
type: object
properties:
pending:
type: integer
examples:
- 1
shortlisted:
type: integer
examples:
- 0
selected:
type: integer
examples:
- 0
rejected:
type: integer
examples:
- 0
pagination:
type: object
properties:
current_page:
type: integer
examples:
- 1
last_page:
type: integer
examples:
- 1
per_page:
type: integer
examples:
- 20
total:
type: integer
examples:
- 1
examples:
-
status: SUCCESS
data:
applicants:
-
id: 019fd2b8-76c6-72bb-a2d9-98ed4934fb02
status: pending
status_label: Eingereicht
applied_at: '2026-08-05 16:18'
has_scheduling_conflict: false
acknowledged_conflict: false
shortlisted_at: null
selected_at: null
rejected_at: null
notes: null
match_score: 78
employee:
id: 019fd2b8-7352-72bc-9514-ac7713e5c225
name: 'Fae G.'
identity_revealed: false
email: null
phone: null
profile:
nationality: AT
city: 'North Asa'
profile_completion_percentage: 86
avg_rating: null
total_shifts_completed: 0
summary:
total: 1
by_status:
pending: 1
shortlisted: 0
selected: 0
rejected: 0
pagination:
current_page: 1
last_page: 1
per_page: 20
total: 1
tags:
- 'Organization API'
parameters:
-
in: path
name: jobId
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
'/api/v1/org/jobs/{jobId}/shifts':
get:
summary: 'List Job Shifts'
operationId: listJobShifts
description: "List a job's shift SLOTS (the `shifts` table — one row per planned slot),\neach with how many of its workers are filled. Per-worker rows live under the\nassignments endpoints, not here. A job has few slots, so the collection is\nloaded once and filtered/paginated in memory."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
job:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-28c4-732f-a94c-fb5a71a7d682
title:
type: string
examples:
- Accountant
status:
type: string
examples:
- active
status_label:
type: string
examples:
- Aktiv
shifts:
type: array
items:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-28d5-7103-b951-9f6ff1d94556
shift_date:
type: string
examples:
- '2026-08-05'
start_time:
type: string
examples:
- '08:00'
end_time:
type: string
examples:
- '16:00'
break_minutes:
type: integer
examples:
- 30
workers_needed:
type: integer
examples:
- 2
filled_count:
type: integer
examples:
- 0
open_count:
type: integer
examples:
- 2
status:
type: string
examples:
- scheduled
status_label:
type: string
examples:
- Geplant
shift_manager:
type:
- string
- 'null'
examples:
- null
notes:
type:
- string
- 'null'
examples:
- null
examples:
-
-
id: 019fd2b8-28d5-7103-b951-9f6ff1d94556
shift_date: '2026-08-05'
start_time: '08:00'
end_time: '16:00'
break_minutes: 30
workers_needed: 2
filled_count: 0
open_count: 2
status: scheduled
status_label: Geplant
shift_manager: null
notes: null
summary:
type: object
properties:
total_slots:
type: integer
examples:
- 1
total_workers_needed:
type: integer
examples:
- 2
total_filled:
type: integer
examples:
- 0
by_status:
type: object
properties:
scheduled:
type: integer
examples:
- 1
in_progress:
type: integer
examples:
- 0
completed:
type: integer
examples:
- 0
cancelled:
type: integer
examples:
- 0
pagination:
type: object
properties:
current_page:
type: integer
examples:
- 1
last_page:
type: integer
examples:
- 1
per_page:
type: integer
examples:
- 50
total:
type: integer
examples:
- 1
examples:
-
status: SUCCESS
data:
job:
id: 019fd2b8-28c4-732f-a94c-fb5a71a7d682
title: Accountant
status: active
status_label: Aktiv
shifts:
-
id: 019fd2b8-28d5-7103-b951-9f6ff1d94556
shift_date: '2026-08-05'
start_time: '08:00'
end_time: '16:00'
break_minutes: 30
workers_needed: 2
filled_count: 0
open_count: 2
status: scheduled
status_label: Geplant
shift_manager: null
notes: null
summary:
total_slots: 1
total_workers_needed: 2
total_filled: 0
by_status:
scheduled: 1
in_progress: 0
completed: 0
cancelled: 0
pagination:
current_page: 1
last_page: 1
per_page: 50
total: 1
tags:
- 'Organization API'
parameters:
-
in: path
name: jobId
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
'/api/v1/org/jobs/{jobId}/contracts':
get:
summary: 'List Job Contracts'
operationId: listJobContracts
description: "List the leasing (Überlassung) contracts tied to a job's shifts, with the\nworker, signing status and a download URL for the signed PDF. Powers the\nContracts tab on the redesigned job detail page."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
job:
type: object
properties:
id:
type: string
examples:
- 019fd2b8-28c4-732f-a94c-fb5a71a7d682
title:
type: string
examples:
- Accountant
contracts:
type: array
examples:
- []
summary:
type: object
properties:
total:
type: integer
examples:
- 0
signed:
type: integer
examples:
- 0
pending:
type: integer
examples:
- 0
examples:
-
status: SUCCESS
data:
job:
id: 019fd2b8-28c4-732f-a94c-fb5a71a7d682
title: Accountant
contracts: []
summary:
total: 0
signed: 0
pending: 0
tags:
- 'Organization API'
parameters:
-
in: path
name: jobId
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
'/api/v1/org/jobs/{jobId}/contract-template':
get:
summary: 'Get Job Contract Template'
operationId: getJobContractTemplate
description: "A job's contract template for the job editor: the job-level override when\none exists (\"customized\"), otherwise the effective template inherited from\nthe organisation default (or the built-in body) — plus the merge fields."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
template:
type: object
properties:
name:
type: string
examples:
- Überlassungsvertrag
body_html:
type: string
examples:
- "
{worker_name}, geboren am {worker_birth_date}, {worker_address}
\n{organization_name}, {organization_address}
\nTätigkeit: {job_title}
Einsatzort: {location}
Zeitraum: {start_date} – {end_date}
Entgelt (brutto/Std.): {hourly_rate}
Kollektivvertrag: {collective_agreement}
Für die Dauer der Überlassung gelten gemäß § 10 AÜG die im Beschäftigerbetrieb für vergleichbare Arbeitnehmer geltenden wesentlichen Arbeits- und Beschäftigungsbedingungen. Rechtsgrundlage: {legal_basis}.
" version: type: integer examples: - 0 is_active: type: boolean examples: - false is_customized: type: boolean examples: - false merge_fields: type: array items: type: string examples: - - contract_number - worker_name - worker_birth_date - worker_nationality - worker_address - organization_name - organization_address - job_title - job_description - location - start_date - end_date - hourly_rate - collective_agreement - legal_basis examples: - status: SUCCESS data: template: name: Überlassungsvertrag body_html: "{worker_name}, geboren am {worker_birth_date}, {worker_address}
\n{organization_name}, {organization_address}
\nTätigkeit: {job_title}
Einsatzort: {location}
Zeitraum: {start_date} – {end_date}
Entgelt (brutto/Std.): {hourly_rate}
Kollektivvertrag: {collective_agreement}
Für die Dauer der Überlassung gelten gemäß § 10 AÜG die im Beschäftigerbetrieb für vergleichbare Arbeitnehmer geltenden wesentlichen Arbeits- und Beschäftigungsbedingungen. Rechtsgrundlage: {legal_basis}.
" version: 0 is_active: false is_customized: false merge_fields: - contract_number - worker_name - worker_birth_date - worker_nationality - worker_address - organization_name - organization_address - job_title - job_description - location - start_date - end_date - hourly_rate - collective_agreement - legal_basis tags: - 'Organization API' put: summary: 'Update Job Contract Template' operationId: updateJobContractTemplate description: "Save (or reset) a job's contract template override. `inherit: true` deletes\nthe job-level row so the job falls back to the organisation default;\notherwise the body is upserted, seeded from the resolved parent (the\norganisation default, or the built-in body) the first time a job is\ncustomised." parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS message: type: string examples: - 'The contract template has been saved.' data: type: object properties: template: type: object properties: name: type: string examples: - Überlassungsvertrag body_html: type: string examples: - "{worker_name}, geboren am {worker_birth_date}, {worker_address}
\n{organization_name}, {organization_address}
\nTätigkeit: {job_title}
Einsatzort: {location}
Zeitraum: {start_date} – {end_date}
Entgelt (brutto/Std.): {hourly_rate}
Kollektivvertrag: {collective_agreement}
Für die Dauer der Überlassung gelten gemäß § 10 AÜG die im Beschäftigerbetrieb für vergleichbare Arbeitnehmer geltenden wesentlichen Arbeits- und Beschäftigungsbedingungen. Rechtsgrundlage: {legal_basis}.
" version: type: integer examples: - 0 is_active: type: boolean examples: - false is_customized: type: boolean examples: - false examples: - status: SUCCESS message: 'The contract template has been saved.' data: template: name: Überlassungsvertrag body_html: "{worker_name}, geboren am {worker_birth_date}, {worker_address}
\n{organization_name}, {organization_address}
\nTätigkeit: {job_title}
Einsatzort: {location}
Zeitraum: {start_date} – {end_date}
Entgelt (brutto/Std.): {hourly_rate}
Kollektivvertrag: {collective_agreement}
Für die Dauer der Überlassung gelten gemäß § 10 AÜG die im Beschäftigerbetrieb für vergleichbare Arbeitnehmer geltenden wesentlichen Arbeits- und Beschäftigungsbedingungen. Rechtsgrundlage: {legal_basis}.
" version: 0 is_active: false is_customized: false tags: - 'Organization API' requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: '' examples: - Beispieltext body_html: type: string description: '' examples: - 'Bitte um Rueckmeldung zur naechsten Schicht.' is_active: type: boolean description: '' examples: - true inherit: type: boolean description: '' examples: - true required: - body_html parameters: - in: path name: jobId description: 'Identifier from the collection.' required: true schema: type: string examples: - 019f9939-c4c3-70fb-a54e-5ebf63db36d2 '/api/v1/org/jobs/{jobId}/applicants/{applicationId}/shortlist': post: summary: 'Shortlist Applicant' operationId: shortlistApplicant description: 'Shortlist an applicant for consideration.' parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS message: type: string examples: - messages.applicant_shortlisted data: type: object properties: application: type: object properties: id: type: string examples: - 019fd2b8-76c6-72bb-a2d9-98ed4934fb02 status: type: string examples: - shortlisted shortlisted_at: type: string examples: - '2026-08-05 16:18' examples: - status: SUCCESS message: messages.applicant_shortlisted data: application: id: 019fd2b8-76c6-72bb-a2d9-98ed4934fb02 status: shortlisted shortlisted_at: '2026-08-05 16:18' tags: - 'Organization API' parameters: - in: path name: jobId description: 'Identifier from the collection.' required: true schema: type: string examples: - 019f9939-c4c3-70fb-a54e-5ebf63db36d2 - in: path name: applicationId description: 'Identifier from the collection.' required: true schema: type: string examples: - 019f9939-c4c3-70fb-a54e-5ebf63db36d2 '/api/v1/org/jobs/{jobId}/applicants/{applicationId}/select': post: summary: 'Select Applicant' operationId: selectApplicant description: 'Select an applicant for the job and create their shifts.' parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS message: type: string examples: - 'The applicant has been selected and assigned to shifts.' data: type: object properties: application: type: object properties: id: type: string examples: - 019fd2b8-76c6-72bb-a2d9-98ed4934fb02 status: type: string examples: - selected selected_at: type: string examples: - '2026-08-05 16:18' shifts_created: type: integer examples: - 1 job_vacancies: type: object properties: total: type: integer examples: - 3 filled: type: integer examples: - 0 available: type: integer examples: - 3 examples: - status: SUCCESS message: 'The applicant has been selected and assigned to shifts.' data: application: id: 019fd2b8-76c6-72bb-a2d9-98ed4934fb02 status: selected selected_at: '2026-08-05 16:18' shifts_created: 1 job_vacancies: total: 3 filled: 0 available: 3 tags: - 'Organization API' parameters: - in: path name: jobId description: 'Identifier from the collection.' required: true schema: type: string examples: - 019f9939-c4c3-70fb-a54e-5ebf63db36d2 - in: path name: applicationId description: 'Identifier from the collection.' required: true schema: type: string examples: - 019f9939-c4c3-70fb-a54e-5ebf63db36d2 '/api/v1/org/jobs/{jobId}/applicants/{applicationId}/waitlist': post: summary: 'Add To Waitlist' operationId: addToWaitlist description: 'Add an applicant to the waitlist (standby).' parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS message: type: string examples: - messages.applicant_added_to_waitlist data: type: object properties: application: type: object properties: id: type: string examples: - 019fd2b8-7cd7-7331-a92c-cf1a3939282f status: type: string examples: - standby waitlist_position: type: integer examples: - 1 added_to_waitlist_at: type: string examples: - '2026-08-05 16:18' waitlist_summary: type: object properties: total: type: integer examples: - 1 max_size: type: integer examples: - 5 positions: type: array items: type: object properties: position: type: integer examples: - 1 application_id: type: string examples: - 019fd2b8-7cd7-7331-a92c-cf1a3939282f added_at: type: string examples: - '2026-08-05 16:18' examples: - - position: 1 application_id: 019fd2b8-7cd7-7331-a92c-cf1a3939282f added_at: '2026-08-05 16:18' examples: - status: SUCCESS message: messages.applicant_added_to_waitlist data: application: id: 019fd2b8-7cd7-7331-a92c-cf1a3939282f status: standby waitlist_position: 1 added_to_waitlist_at: '2026-08-05 16:18' waitlist_summary: total: 1 max_size: 5 positions: - position: 1 application_id: 019fd2b8-7cd7-7331-a92c-cf1a3939282f added_at: '2026-08-05 16:18' tags: - 'Organization API' requestBody: required: false content: application/json: schema: type: object properties: position: type: - integer - 'null' description: '' examples: - 1 parameters: - in: path name: jobId description: 'Identifier from the collection.' required: true schema: type: string examples: - 019f9939-c4c3-70fb-a54e-5ebf63db36d2 - in: path name: applicationId description: 'Identifier from the collection.' required: true schema: type: string examples: - 019f9939-c4c3-70fb-a54e-5ebf63db36d2 '/api/v1/org/jobs/{jobId}/applicants/{applicationId}/reject': post: summary: 'Reject Applicant' operationId: rejectApplicant description: 'Reject an applicant for the job.' parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS message: type: string examples: - 'The applicant has been rejected.' data: type: object properties: application: type: object properties: id: type: string examples: - 019fd2b8-7cd7-7331-a92c-cf1a3939282f status: type: string examples: - rejected rejected_at: type: string examples: - '2026-08-05 16:18' examples: - status: SUCCESS message: 'The applicant has been rejected.' data: application: id: 019fd2b8-7cd7-7331-a92c-cf1a3939282f status: rejected rejected_at: '2026-08-05 16:18' tags: - 'Organization API' requestBody: required: true content: application/json: schema: type: object properties: reason_code: type: string description: 'Allowed: position_filled, qualifications_not_met, insufficient_experience, availability_mismatch, language_requirement, better_candidate_selected, other.' examples: - position_filled internal_note: type: string description: '' examples: - Beispieltext required: - reason_code parameters: - in: path name: jobId description: 'Identifier from the collection.' required: true schema: type: string examples: - 019f9939-c4c3-70fb-a54e-5ebf63db36d2 - in: path name: applicationId description: 'Identifier from the collection.' required: true schema: type: string examples: - 019f9939-c4c3-70fb-a54e-5ebf63db36d2 '/api/v1/org/jobs/{jobId}/applicants/{applicationId}/shifts/{shiftId}/deassign': post: summary: 'Deassign Shift' operationId: deassignShift description: 'De-assign a worker from one of their chosen shifts.' parameters: [] responses: { } tags: - 'Organization API' requestBody: required: true content: application/json: schema: type: object properties: reason: type: string description: '' examples: - 'Krankheitsbedingt kurzfristig abgesagt.' required: - reason parameters: - in: path name: jobId description: 'Identifier from the collection.' required: true schema: type: string examples: - 019f9939-c4c3-70fb-a54e-5ebf63db36d2 - in: path name: applicationId description: 'Identifier from the collection.' required: true schema: type: string examples: - 019f9939-c4c3-70fb-a54e-5ebf63db36d2 - in: path name: shiftId description: 'Identifier from the collection.' required: true schema: type: string examples: - 019f9939-c4c3-70fb-a54e-5ebf63db36d2 '/api/v1/org/jobs/{jobId}/applicants/{applicationId}': get: summary: "Get a single applicant's profile." operationId: getASingleApplicantsProfile description: "Per Austrian AÜG (Arbeitskräfteüberlassungsgesetz), client organizations\nmust be able to verify worker qualifications before assignment — but not\ntheir identity, which stays masked until the company selects them.\n\nPassing `reveal=true` unmasks it early. That requires the `audit.view`\npermission and writes an OrgPiiReveal audit entry before the data is\nreturned, so the record is made where the disclosure actually happens rather\nthan wherever a client chooses to report it." parameters: - in: query name: reveal description: "Unmask the applicant's identity. Requires `audit.view`; audited." required: false schema: type: boolean description: "Unmask the applicant's identity. Requires `audit.view`; audited." examples: - true responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS data: type: object properties: id: type: string examples: - 019fd2b8-76c6-72bb-a2d9-98ed4934fb02 status: type: string examples: - selected status_label: type: string examples: - Ausgewählt applied_at: type: string examples: - '2026-08-05 16:18' has_scheduling_conflict: type: boolean examples: - false acknowledged_conflict: type: boolean examples: - false shortlisted_at: type: string examples: - '2026-08-05 16:18' selected_at: type: string examples: - '2026-08-05 16:18' rejected_at: type: - string - 'null' examples: - null notes: type: - string - 'null' examples: - null chosen_shifts: type: array items: type: object properties: id: type: string examples: - 019fd2b8-756e-70aa-a7ad-01157af79df0 shift_date: type: string examples: - '2026-08-12' start_time: type: string examples: - '08:00:00' end_time: type: string examples: - '16:00:00' examples: - - id: 019fd2b8-756e-70aa-a7ad-01157af79df0 shift_date: '2026-08-12' start_time: '08:00:00' end_time: '16:00:00' cover_letter: type: - string - 'null' examples: - null availability: type: - string - 'null' examples: - null expected_hourly_rate: type: - string - 'null' examples: - null application_documents: type: array examples: - [] user: type: object properties: id: type: string examples: - 019fd2b8-7352-72bc-9514-ac7713e5c225 display_name: type: string examples: - 'Fae Green' first_name: type: string examples: - Fae last_name: type: string examples: - Green email: type: string examples: - ruthie17@example.com phone: type: - string - 'null' examples: - null avatar_url: type: - string - 'null' examples: - null profile: type: object properties: nationality: type: string examples: - AT city: type: string examples: - 'North Asa' gender: type: string examples: - not_specified date_of_birth: type: string examples: - '2007-02-21' profile_completion_percentage: type: integer examples: - 86 avg_rating: type: integer examples: - 0 reliability_score: type: integer examples: - 100 punctuality_percentage: type: - string - 'null' examples: - null hours_worked: type: integer examples: - 0 total_shifts_completed: type: integer examples: - 0 no_shows_count: type: integer examples: - 0 bio: type: - string - 'null' examples: - null education: type: - string - 'null' examples: - null skills: type: array examples: - [] languages: type: array examples: - [] certifications: type: array examples: - [] reviews: type: array examples: - [] documents: type: array examples: - [] examples: - status: SUCCESS data: id: 019fd2b8-76c6-72bb-a2d9-98ed4934fb02 status: selected status_label: Ausgewählt applied_at: '2026-08-05 16:18' has_scheduling_conflict: false acknowledged_conflict: false shortlisted_at: '2026-08-05 16:18' selected_at: '2026-08-05 16:18' rejected_at: null notes: null chosen_shifts: - id: 019fd2b8-756e-70aa-a7ad-01157af79df0 shift_date: '2026-08-12' start_time: '08:00:00' end_time: '16:00:00' cover_letter: null availability: null expected_hourly_rate: null application_documents: [] user: id: 019fd2b8-7352-72bc-9514-ac7713e5c225 display_name: 'Fae Green' first_name: Fae last_name: Green email: ruthie17@example.com phone: null avatar_url: null profile: nationality: AT city: 'North Asa' gender: not_specified date_of_birth: '2007-02-21' profile_completion_percentage: 86 avg_rating: 0 reliability_score: 100 punctuality_percentage: null hours_worked: 0 total_shifts_completed: 0 no_shows_count: 0 bio: null education: null skills: [] languages: [] certifications: [] reviews: [] documents: [] 403: description: 'Not permitted to reveal' content: application/json: schema: type: object properties: status: type: string examples: - FORBIDDEN message: type: string examples: - 'You are not permitted to reveal applicant identities.' examples: - status: FORBIDDEN message: 'You are not permitted to reveal applicant identities.' tags: - 'Organization API' parameters: - in: path name: jobId description: '' required: true schema: type: string examples: - architecto - in: path name: applicationId description: '' required: true schema: type: string examples: - architecto '/api/v1/org/shifts/{shiftId}': get: summary: 'Get Shift Detail' operationId: getShiftDetail description: "Returns a single shift slot with its worker assignments and each\nassignment's live check-in / clock state — backs the portal's live\nshift view page." parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS data: type: object properties: shift: type: object properties: id: type: string examples: - 019fd2b8-28d5-7103-b951-9f6ff1d94556 job: type: object properties: id: type: string examples: - 019fd2b8-28c4-732f-a94c-fb5a71a7d682 title: type: string examples: - Accountant shift_date: type: string examples: - '2026-08-05' start_time: type: string examples: - '08:00:00' end_time: type: string examples: - '16:00:00' break_minutes: type: integer examples: - 30 workers_needed: type: integer examples: - 2 notes: type: - string - 'null' examples: - null status: type: string examples: - scheduled status_label: type: string examples: - Geplant shift_manager: type: - string - 'null' examples: - null counts: type: object properties: needed: type: integer examples: - 2 awaiting_signature: type: integer examples: - 0 signed: type: integer examples: - 0 checked_in: type: integer examples: - 0 completed: type: integer examples: - 0 no_show: type: integer examples: - 0 assignments: type: array examples: - [] examples: - status: SUCCESS data: shift: id: 019fd2b8-28d5-7103-b951-9f6ff1d94556 job: id: 019fd2b8-28c4-732f-a94c-fb5a71a7d682 title: Accountant shift_date: '2026-08-05' start_time: '08:00:00' end_time: '16:00:00' break_minutes: 30 workers_needed: 2 notes: null status: scheduled status_label: Geplant shift_manager: null counts: needed: 2 awaiting_signature: 0 signed: 0 checked_in: 0 completed: 0 no_show: 0 assignments: [] tags: - 'Organization API' parameters: - in: path name: shiftId description: 'Identifier from the collection.' required: true schema: type: string examples: - 019f9939-c4c3-70fb-a54e-5ebf63db36d2 '/api/v1/org/shifts/{shiftId}/contract-template': get: summary: 'Get Shift Contract Template' operationId: getShiftContractTemplate description: "A shift's contract template for the shift editor: the shift-level override\nwhen one exists (\"customized\"), otherwise the effective template inherited\nfrom the job override (or the organisation default, or the built-in body)\n— plus the merge fields." parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS data: type: object properties: template: type: object properties: name: type: string examples: - Überlassungsvertrag body_html: type: string examples: - "{worker_name}, geboren am {worker_birth_date}, {worker_address}
\n{organization_name}, {organization_address}
\nTätigkeit: {job_title}
Einsatzort: {location}
Zeitraum: {start_date} – {end_date}
Entgelt (brutto/Std.): {hourly_rate}
Kollektivvertrag: {collective_agreement}
Für die Dauer der Überlassung gelten gemäß § 10 AÜG die im Beschäftigerbetrieb für vergleichbare Arbeitnehmer geltenden wesentlichen Arbeits- und Beschäftigungsbedingungen. Rechtsgrundlage: {legal_basis}.
" version: type: integer examples: - 0 is_active: type: boolean examples: - false is_customized: type: boolean examples: - false merge_fields: type: array items: type: string examples: - - contract_number - worker_name - worker_birth_date - worker_nationality - worker_address - organization_name - organization_address - job_title - job_description - location - start_date - end_date - hourly_rate - collective_agreement - legal_basis examples: - status: SUCCESS data: template: name: Überlassungsvertrag body_html: "{worker_name}, geboren am {worker_birth_date}, {worker_address}
\n{organization_name}, {organization_address}
\nTätigkeit: {job_title}
Einsatzort: {location}
Zeitraum: {start_date} – {end_date}
Entgelt (brutto/Std.): {hourly_rate}
Kollektivvertrag: {collective_agreement}
Für die Dauer der Überlassung gelten gemäß § 10 AÜG die im Beschäftigerbetrieb für vergleichbare Arbeitnehmer geltenden wesentlichen Arbeits- und Beschäftigungsbedingungen. Rechtsgrundlage: {legal_basis}.
" version: 0 is_active: false is_customized: false merge_fields: - contract_number - worker_name - worker_birth_date - worker_nationality - worker_address - organization_name - organization_address - job_title - job_description - location - start_date - end_date - hourly_rate - collective_agreement - legal_basis tags: - 'Organization API' put: summary: 'Update Shift Contract Template' operationId: updateShiftContractTemplate description: "Save (or reset) a shift's contract template override. `inherit: true`\ndeletes the shift-level row so the shift falls back to its job's template\n(or the organisation default); otherwise the body is upserted, seeded from\nthe resolved job-level body the first time a shift is customised." parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS message: type: string examples: - 'The contract template has been saved.' data: type: object properties: template: type: object properties: name: type: string examples: - Überlassungsvertrag body_html: type: string examples: - "{worker_name}, geboren am {worker_birth_date}, {worker_address}
\n{organization_name}, {organization_address}
\nTätigkeit: {job_title}
Einsatzort: {location}
Zeitraum: {start_date} – {end_date}
Entgelt (brutto/Std.): {hourly_rate}
Kollektivvertrag: {collective_agreement}
Für die Dauer der Überlassung gelten gemäß § 10 AÜG die im Beschäftigerbetrieb für vergleichbare Arbeitnehmer geltenden wesentlichen Arbeits- und Beschäftigungsbedingungen. Rechtsgrundlage: {legal_basis}.
" version: type: integer examples: - 0 is_active: type: boolean examples: - false is_customized: type: boolean examples: - false examples: - status: SUCCESS message: 'The contract template has been saved.' data: template: name: Überlassungsvertrag body_html: "{worker_name}, geboren am {worker_birth_date}, {worker_address}
\n{organization_name}, {organization_address}
\nTätigkeit: {job_title}
Einsatzort: {location}
Zeitraum: {start_date} – {end_date}
Entgelt (brutto/Std.): {hourly_rate}
Kollektivvertrag: {collective_agreement}
Für die Dauer der Überlassung gelten gemäß § 10 AÜG die im Beschäftigerbetrieb für vergleichbare Arbeitnehmer geltenden wesentlichen Arbeits- und Beschäftigungsbedingungen. Rechtsgrundlage: {legal_basis}.
" version: 0 is_active: false is_customized: false tags: - 'Organization API' requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: '' examples: - Beispieltext body_html: type: string description: '' examples: - 'Bitte um Rueckmeldung zur naechsten Schicht.' is_active: type: boolean description: '' examples: - true inherit: type: boolean description: '' examples: - true required: - body_html parameters: - in: path name: shiftId description: 'Identifier from the collection.' required: true schema: type: string examples: - 019f9939-c4c3-70fb-a54e-5ebf63db36d2 /api/v1/org/shifts/scan-qr: post: summary: 'Scan Check In Qr' operationId: scanCheckInQr description: "Scan an employee's QR code to record check-in/check-out." parameters: [] responses: { } tags: - 'Organization API' requestBody: required: true content: application/json: schema: type: object properties: qr_payload: type: string description: '' examples: - Beispieltext lat: type: - integer - 'null' description: '' examples: - 1 lng: type: - integer - 'null' description: '' examples: - 1 signature: type: - string - 'null' description: '' examples: - Beispieltext required: - qr_payload '/api/v1/org/shifts/{shiftId}/cancel': post: summary: 'Cancel Shift By Organisation' operationId: cancelShiftByOrganisation description: 'Organization cancels a shift.' parameters: [] responses: { } tags: - 'Organization API' requestBody: required: true content: application/json: schema: type: object properties: reason: type: string description: '' examples: - 'Krankheitsbedingt kurzfristig abgesagt.' required: - reason parameters: - in: path name: shiftId description: 'Identifier from the collection.' required: true schema: type: string examples: - 019f9939-c4c3-70fb-a54e-5ebf63db36d2 '/api/v1/org/shifts/{shiftId}/extend': post: summary: 'Notify Shift Extension' operationId: notifyShiftExtension description: "Allows an organisation to extend an active shift — updating the end time\nand notifying the assigned employee via push notification.\n\nThe extension is only allowed when the shift is currently `in_progress`.\nThe organisation must provide a reason and the new end time must be later\nthan the current scheduled end time." parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS data: type: object properties: message: type: string examples: - 'Schichtverlängerung wurde gemeldet.' extended_end_time: type: string examples: - '20:00' examples: - status: SUCCESS data: message: 'Schichtverlängerung wurde gemeldet.' extended_end_time: '20:00' 400: description: '' content: application/json: schema: type: object properties: status: type: string examples: - ERROR message: type: string examples: - 'Die Schicht ist nicht aktiv.' examples: - status: ERROR message: 'Die Schicht ist nicht aktiv.' 403: description: '' content: application/json: schema: type: object properties: status: type: string examples: - ERROR message: type: string examples: - 'Diese Schicht gehört nicht zu Ihrem Unternehmen.' examples: - status: ERROR message: 'Diese Schicht gehört nicht zu Ihrem Unternehmen.' 404: description: '' content: application/json: schema: type: object properties: status: type: string examples: - ERROR message: type: string examples: - 'Schicht nicht gefunden.' examples: - status: ERROR message: 'Schicht nicht gefunden.' 422: description: '' content: application/json: schema: type: object properties: status: type: string examples: - ERROR message: type: string examples: - 'The extended end time field is required.' examples: - status: ERROR message: 'The extended end time field is required.' tags: - 'Organization API' requestBody: required: true content: application/json: schema: type: object properties: extended_end_time: type: string description: 'New end time in HH:MM format (must be after current end).' examples: - '20:00' reason: type: string description: 'Reason for the extension (max 500 chars).' examples: - 'Production running late, need 2 more hours.' required: - extended_end_time - reason parameters: - in: path name: shiftId description: 'UUID of the shift.' required: true schema: type: string examples: - 9c3f5f3d-0123-4abc-b456-426614174000 '/api/v1/org/shifts/{shiftId}/rate': post: summary: 'Rate Employee' operationId: rateEmployee description: 'Organization submits a rating for an employee after shift completion.' parameters: [] responses: 201: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS message: type: string examples: - 'Your rating has been submitted successfully.' data: type: object properties: rating: type: object properties: id: type: string examples: - 019fd2b8-45d9-707b-89cf-d4a026834fe3 overall_score: type: integer examples: - 1 created_at: type: string examples: - '2026-08-05 16:18' examples: - status: SUCCESS message: 'Your rating has been submitted successfully.' data: rating: id: 019fd2b8-45d9-707b-89cf-d4a026834fe3 overall_score: 1 created_at: '2026-08-05 16:18' tags: - 'Organization API' requestBody: required: true content: application/json: schema: type: object properties: overall_score: type: integer description: '' examples: - 1 punctuality_score: type: integer description: '' examples: - 1 professionalism_score: type: integer description: '' examples: - 1 communication_score: type: integer description: '' examples: - 1 work_quality_score: type: integer description: '' examples: - 1 comment: type: string description: '' examples: - Beispieltext required: - overall_score parameters: - in: path name: shiftId description: 'Identifier from the collection.' required: true schema: type: string examples: - 019f9939-c4c3-70fb-a54e-5ebf63db36d2 /api/v1/org/requests: get: summary: 'List Shift Requests' operationId: listShiftRequests description: "The company's inbox of worker requests. Pending ones come first regardless\nof sort, because they are the only ones that need an action — and until they\nare decided the shift is not settled and the worker is not paid." parameters: - in: query name: status description: 'Allowed: pending, approved, declined, withdrawn.' required: false schema: type: string description: 'Allowed: pending, approved, declined, withdrawn.' examples: - pending - in: query name: type description: 'Allowed: overtime, early_end, hours_correction, manual_check_in, absence_excuse, workplace_change.' required: false schema: type: string description: 'Allowed: overtime, early_end, hours_correction, manual_check_in, absence_excuse, workplace_change.' examples: - overtime - in: query name: shift_id description: 'Only requests against this assignment.' required: false schema: type: string description: 'Only requests against this assignment.' examples: - 019f9939-c4c3-70fb-a54e-5ebf63db36d2 - in: query name: per_page description: 'Items per page (max 100).' required: false schema: type: integer description: 'Items per page (max 100).' examples: - 25 responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS data: type: object properties: requests: type: array examples: - [] pending_count: type: integer examples: - 0 pagination: type: object properties: current_page: type: integer examples: - 1 last_page: type: integer examples: - 1 per_page: type: integer examples: - 7 total: type: integer examples: - 0 examples: - status: SUCCESS data: requests: [] pending_count: 0 pagination: current_page: 1 last_page: 1 per_page: 7 total: 0 tags: - 'Organization API' requestBody: required: false content: application/json: schema: type: object properties: status: type: - string - 'null' description: '' enum: - pending - approved - declined - withdrawn examples: - declined type: type: - string - 'null' description: '' enum: - overtime - early_end - hours_correction - manual_check_in - absence_excuse - workplace_change examples: - manual_check_in shift_id: type: - string - 'null' description: 'Must be a valid UUID.' examples: - 6ff8f7f6-1eb3-3525-be4a-3932c805afed per_page: type: - integer - 'null' description: 'Must be at least 1. Must not be greater than 100.' examples: - 7 '/api/v1/org/requests/{requestId}/decide': post: summary: 'Approve or Decline a Shift Request' operationId: approveOrDeclineAShiftRequest description: "The company's answer to a worker. Approving overtime raises what the shift\npays; declining leaves it at the capped amount. Either way the decision is\nstamped with whoever made it — the organisation account or the member — and\nwritten to the audit trail, because it changes what someone is paid.\n\nA decline must carry a reason. The worker sees it." parameters: [] responses: 409: description: 'Already decided' content: application/json: schema: type: object properties: status: type: string examples: - INVALID_OPERATION message: type: string examples: - 'This request has already been decided.' examples: - status: INVALID_OPERATION message: 'This request has already been decided.' tags: - 'Organization API' requestBody: required: true content: application/json: schema: type: object properties: approve: type: boolean description: 'Whether the request is granted.' examples: - true note: type: - string - 'null' description: 'The reason. Required when declining.' examples: - 'Overtime was not authorised on site.' required: - approve parameters: - in: path name: requestId description: 'The request being decided.' required: true schema: type: string examples: - 019f9939-c4c3-70fb-a54e-5ebf63db36d2 '/api/v1/org/requests/{requestId}/conversation': post: summary: 'Open a Conversation About a Shift Request' operationId: openAConversationAboutAShiftRequest description: "Starts (or returns) the thread between the company and the worker about one\nspecific request — for when a manager needs to ask something before\ndeciding, rather than approving or declining blind.\n\nScoped to the request, not the shift, so the exchange stays attached to the\ndecision it belongs to. Calling this twice returns the same thread." parameters: [] responses: 200: description: 'Thread ready' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS data: type: object properties: conversation_id: type: string examples: - 019f... shift_request_id: type: string examples: - 019f... subject: type: string examples: - Überstunden examples: - status: SUCCESS data: conversation_id: 019f... shift_request_id: 019f... subject: Überstunden tags: - 'Organization API' parameters: - in: path name: requestId description: 'The request to discuss.' required: true schema: type: string examples: - 019f9939-c4c3-70fb-a54e-5ebf63db36d2 /api/v1/org/notifications: get: summary: 'List Notifications' operationId: listNotifications description: "Paginated list of notifications for the authenticated organisation.\nIncludes an `unread_count` in `meta` for the inbox badge." parameters: - in: query name: page description: 'Defaults to 1.' required: false schema: type: integer description: 'Defaults to 1.' examples: - 16 - in: query name: per_page description: 'Defaults to 20 (max 100).' required: false schema: type: integer description: 'Defaults to 20 (max 100).' examples: - 16 - in: query name: unread_only description: 'nullable When true, returns only unread notifications.' required: false schema: type: boolean description: 'nullable When true, returns only unread notifications.' examples: - false responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS message: type: string examples: - 'Notifications retrieved successfully.' data: type: array examples: - [] errors: type: - string - 'null' examples: - null meta: type: object properties: request_id: type: string examples: - 09377940-8cb9-4640-a522-b88869dfb7fe timestamp: type: string examples: - '2026-08-05T16:18:38.542194Z' current_page: type: integer examples: - 16 per_page: type: integer examples: - 16 total: type: integer examples: - 0 last_page: type: integer examples: - 1 unread_count: type: integer examples: - 0 examples: - status: SUCCESS message: 'Notifications retrieved successfully.' data: [] errors: null meta: request_id: 09377940-8cb9-4640-a522-b88869dfb7fe timestamp: '2026-08-05T16:18:38.542194Z' current_page: 16 per_page: 16 total: 0 last_page: 1 unread_count: 0 tags: - 'Organization API' /api/v1/org/notifications/unread-count: get: summary: 'Get Unread Notifications Count' operationId: getUnreadNotificationsCount description: '' parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS message: type: string examples: - Success data: type: object properties: count: type: integer examples: - 0 errors: type: - string - 'null' examples: - null meta: type: object properties: request_id: type: string examples: - a0972d73-64ed-4c2d-a149-88962625ec88 timestamp: type: string examples: - '2026-08-05T16:18:38.548222Z' examples: - status: SUCCESS message: Success data: count: 0 errors: null meta: request_id: a0972d73-64ed-4c2d-a149-88962625ec88 timestamp: '2026-08-05T16:18:38.548222Z' tags: - 'Organization API' '/api/v1/org/notifications/{notification}/read': post: summary: 'Mark Notification As Read' operationId: markNotificationAsRead description: 'Marks a single notification as read for the authenticated organisation.' parameters: [] responses: 200: description: Success content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS message: type: string examples: - 'Notification marked as read.' data: type: object properties: id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 read_at: type: string examples: - '2026-04-02T12:00:00+00:00' errors: type: - string - 'null' examples: - null meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: SUCCESS message: 'Notification marked as read.' data: id: 550e8400-e29b-41d4-a716-446655440000 read_at: '2026-04-02T12:00:00+00:00' errors: null meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' 404: description: 'Not Found' content: application/json: schema: type: object properties: status: type: string examples: - NOT_FOUND message: type: string examples: - 'Notification not found.' data: type: - string - 'null' examples: - null errors: type: - string - 'null' examples: - null meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: NOT_FOUND message: 'Notification not found.' data: null errors: null meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' tags: - 'Organization API' parameters: - in: path name: notification description: 'The notification.' required: true schema: type: string examples: - architecto - in: path name: id description: 'The notification UUID.' required: true schema: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 /api/v1/org/notifications/read-all: post: summary: 'Mark All Notifications As Read' operationId: markAllNotificationsAsRead description: 'Marks every unread notification of the authenticated organisation as read in a single call.' parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS message: type: string examples: - 'All notifications marked as read.' data: type: object properties: marked: type: boolean examples: - true errors: type: - string - 'null' examples: - null meta: type: object properties: request_id: type: string examples: - d6f09336-8a5c-476c-880f-8abb84800194 timestamp: type: string examples: - '2026-08-05T16:18:38.554649Z' examples: - status: SUCCESS message: 'All notifications marked as read.' data: marked: true errors: null meta: request_id: d6f09336-8a5c-476c-880f-8abb84800194 timestamp: '2026-08-05T16:18:38.554649Z' tags: - 'Organization API' /api/v1/org/notification-preferences: get: summary: 'Get Notification Preferences' operationId: getNotificationPreferences description: "Returns per-category notification preferences for the authenticated organisation.\nDefaults to email enabled / push disabled for every category." parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS message: type: string examples: - Success data: type: array items: type: object properties: category: type: string examples: - jobs email: type: boolean examples: - true push: type: boolean examples: - false examples: - - category: jobs email: true push: false - category: finance email: true push: false - category: communication email: true push: false - category: security email: true push: false - category: system email: true push: false - category: marketing email: true push: false errors: type: - string - 'null' examples: - null meta: type: object properties: request_id: type: string examples: - 062e170a-40d4-47f4-a976-a64ae4b9bad4 timestamp: type: string examples: - '2026-08-05T16:18:38.560328Z' examples: - status: SUCCESS message: Success data: - category: jobs email: true push: false - category: finance email: true push: false - category: communication email: true push: false - category: security email: true push: false - category: system email: true push: false - category: marketing email: true push: false errors: null meta: request_id: 062e170a-40d4-47f4-a976-a64ae4b9bad4 timestamp: '2026-08-05T16:18:38.560328Z' tags: - 'Organization API' put: summary: 'Update Notification Preferences' operationId: updateNotificationPreferences description: '' parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS message: type: string examples: - 'Notification preference updated.' data: type: object properties: category: type: string examples: - finance email: type: boolean examples: - true push: type: boolean examples: - false errors: type: - string - 'null' examples: - null meta: type: object properties: request_id: type: string examples: - 7f992b80-e97b-48f0-a60d-8d3da4d4684e timestamp: type: string examples: - '2026-08-05T16:18:38.567378Z' examples: - status: SUCCESS message: 'Notification preference updated.' data: category: finance email: true push: false errors: null meta: request_id: 7f992b80-e97b-48f0-a60d-8d3da4d4684e timestamp: '2026-08-05T16:18:38.567378Z' 422: description: 'Validation Error' content: application/json: schema: type: object properties: status: type: string examples: - VALIDATION_ERROR message: type: string examples: - 'The given data was invalid.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: string examples: - category message: type: string examples: - 'The selected category is invalid.' examples: - - field: category message: 'The selected category is invalid.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: VALIDATION_ERROR message: 'The given data was invalid.' data: null errors: - field: category message: 'The selected category is invalid.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' tags: - 'Organization API' requestBody: required: true content: application/json: schema: type: object properties: category: type: string description: 'Notification category (jobs, finance, communication, security, system, marketing).' examples: - finance channel: type: string description: 'Allowed: email, push.' examples: - email enabled: type: boolean description: 'true to enable, false to disable.' examples: - true required: - category - channel - enabled /api/v1/mobile/auth/forgot-password: post: summary: 'Forgot Password' operationId: forgotPassword description: 'Sends a 4-digit password reset code to the given email address.' parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS message: type: string examples: - 'If that email address is registered, a password reset code has been sent.' data: type: object properties: email: type: string examples: - opal56@example.net code: type: string examples: - '448891' errors: type: - string - 'null' examples: - null meta: type: object properties: request_id: type: string examples: - 04e13c3e-6945-4f40-bb63-a330434430e3 timestamp: type: string examples: - '2026-08-05T16:18:54.164086Z' examples: - status: SUCCESS message: 'If that email address is registered, a password reset code has been sent.' data: email: opal56@example.net code: '448891' errors: null meta: request_id: 04e13c3e-6945-4f40-bb63-a330434430e3 timestamp: '2026-08-05T16:18:54.164086Z' 422: description: 'Validation Error' content: application/json: schema: type: object properties: status: type: string examples: - VALIDATION_ERROR message: type: string examples: - 'The given data was invalid.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: string examples: - guard message: type: string examples: - 'The guard field is required.' examples: - - field: guard message: 'The guard field is required.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: VALIDATION_ERROR message: 'The given data was invalid.' data: null errors: - field: guard message: 'The guard field is required.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' 429: description: 'Rate Limited' content: application/json: schema: type: object properties: status: type: string examples: - RATE_LIMITED message: type: string examples: - 'Too many requests.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: - string - 'null' examples: - null message: type: string examples: - 'Too many requests.' examples: - - field: null message: 'Too many requests.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-21T19:00:00.000000Z' examples: - status: RATE_LIMITED message: 'Too many requests.' data: null errors: - field: null message: 'Too many requests.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-21T19:00:00.000000Z' tags: - 'Organization API' requestBody: required: true content: application/json: schema: type: object properties: email: type: string description: 'Email address to send reset code to.' examples: - boris@example.com guard: type: string description: 'Actor type ("user", "organization", or "admin").' examples: - user required: - email - guard security: [] /api/v1/mobile/auth/forgot-password/verify: post: summary: 'Verify Reset Code' operationId: verifyResetCode description: 'Validates the 4-digit password reset code for the given email and guard.' parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS message: type: string examples: - 'Reset code verified successfully.' data: type: object properties: reset_token: type: string examples: - c97701d0-c4de-4755-b3c4-f7d1a803efc5 errors: type: - string - 'null' examples: - null meta: type: object properties: request_id: type: string examples: - 67df2724-9771-46b5-8d4d-71f98573d3e5 timestamp: type: string examples: - '2026-08-05T16:18:54.166696Z' examples: - status: SUCCESS message: 'Reset code verified successfully.' data: reset_token: c97701d0-c4de-4755-b3c4-f7d1a803efc5 errors: null meta: request_id: 67df2724-9771-46b5-8d4d-71f98573d3e5 timestamp: '2026-08-05T16:18:54.166696Z' 401: description: 'Invalid Code' content: application/json: schema: type: object properties: status: type: string examples: - RESET_CODE_INVALID message: type: string examples: - 'Invalid reset code.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: string examples: - code message: type: string examples: - 'Invalid reset code.' examples: - - field: code message: 'Invalid reset code.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: RESET_CODE_INVALID message: 'Invalid reset code.' data: null errors: - field: code message: 'Invalid reset code.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' 410: description: 'Code Expired' content: application/json: schema: type: object properties: status: type: string examples: - RESET_CODE_EXPIRED message: type: string examples: - 'Reset code has expired.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: string examples: - code message: type: string examples: - 'Reset code has expired.' examples: - - field: code message: 'Reset code has expired.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: RESET_CODE_EXPIRED message: 'Reset code has expired.' data: null errors: - field: code message: 'Reset code has expired.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' 422: description: 'Validation Error' content: application/json: schema: type: object properties: status: type: string examples: - VALIDATION_ERROR message: type: string examples: - 'The given data was invalid.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: string examples: - code message: type: string examples: - 'The code field is required.' examples: - - field: code message: 'The code field is required.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: VALIDATION_ERROR message: 'The given data was invalid.' data: null errors: - field: code message: 'The code field is required.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' 429: description: 'Too Many Attempts' content: application/json: schema: type: object properties: status: type: string examples: - RESET_ATTEMPTS_EXHAUSTED message: type: string examples: - 'Too many failed attempts. Please request a new code.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: string examples: - code message: type: string examples: - 'Too many failed attempts. Please request a new code.' examples: - - field: code message: 'Too many failed attempts. Please request a new code.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: RESET_ATTEMPTS_EXHAUSTED message: 'Too many failed attempts. Please request a new code.' data: null errors: - field: code message: 'Too many failed attempts. Please request a new code.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' tags: - 'Organization API' requestBody: required: true content: application/json: schema: type: object properties: email: type: string description: 'Email address for password reset.' examples: - boris@example.com code: type: string description: '6-digit reset code.' examples: - '123456' guard: type: string description: 'Actor type ("user", "organization", or "admin").' examples: - user required: - email - code - guard security: [] /api/v1/mobile/auth/forgot-password/resend: post: summary: 'Resend Reset Code' operationId: resendResetCode description: 'Re-sends a 4-digit password reset code for the given email and guard.' parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS message: type: string examples: - 'If that email address is registered, a new password reset code has been sent.' data: type: object properties: code: type: string examples: - '443677' errors: type: - string - 'null' examples: - null meta: type: object properties: request_id: type: string examples: - a265e26e-388c-4782-b9ce-bc4722cc5958 timestamp: type: string examples: - '2026-08-05T16:18:58.095803Z' examples: - status: SUCCESS message: 'If that email address is registered, a new password reset code has been sent.' data: code: '443677' errors: null meta: request_id: a265e26e-388c-4782-b9ce-bc4722cc5958 timestamp: '2026-08-05T16:18:58.095803Z' 422: description: 'Validation Error' content: application/json: schema: type: object properties: status: type: string examples: - VALIDATION_ERROR message: type: string examples: - 'The given data was invalid.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: string examples: - guard message: type: string examples: - 'The guard field is required.' examples: - - field: guard message: 'The guard field is required.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: VALIDATION_ERROR message: 'The given data was invalid.' data: null errors: - field: guard message: 'The guard field is required.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' 429: description: 'Rate Limited' content: application/json: schema: type: object properties: status: type: string examples: - RATE_LIMITED message: type: string examples: - 'Too many requests.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: - string - 'null' examples: - null message: type: string examples: - 'Too many requests.' examples: - - field: null message: 'Too many requests.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-21T19:00:00.000000Z' examples: - status: RATE_LIMITED message: 'Too many requests.' data: null errors: - field: null message: 'Too many requests.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-21T19:00:00.000000Z' tags: - 'Organization API' requestBody: required: true content: application/json: schema: type: object properties: email: type: string description: 'Email address to resend reset code to.' examples: - boris@example.com guard: type: string description: 'Actor type ("user", "organization", or "admin").' examples: - user required: - email - guard security: [] /api/v1/mobile/auth/reset-password: post: summary: 'Reset Password' operationId: resetPassword description: 'Resets the password for any actor type and revokes all existing tokens.' parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS message: type: string examples: - 'Password has been reset successfully.' data: type: - string - 'null' examples: - null errors: type: - string - 'null' examples: - null meta: type: object properties: request_id: type: string examples: - 85c34424-2c5f-4d2e-aa97-5edf63d5d429 timestamp: type: string examples: - '2026-08-05T16:18:54.626775Z' examples: - status: SUCCESS message: 'Password has been reset successfully.' data: null errors: null meta: request_id: 85c34424-2c5f-4d2e-aa97-5edf63d5d429 timestamp: '2026-08-05T16:18:54.626775Z' 403: description: 'Email Not Verified' content: application/json: schema: type: object properties: status: type: string examples: - RESET_NOT_VERIFIED message: type: string examples: - 'Email not verified. Complete the verification step first.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: - string - 'null' examples: - null message: type: string examples: - 'Email not verified. Complete the verification step first.' examples: - - field: null message: 'Email not verified. Complete the verification step first.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: RESET_NOT_VERIFIED message: 'Email not verified. Complete the verification step first.' data: null errors: - field: null message: 'Email not verified. Complete the verification step first.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' 404: description: 'Account Not Found' content: application/json: schema: type: object properties: status: type: string examples: - ACCOUNT_NOT_FOUND message: type: string examples: - 'Account not found.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: - string - 'null' examples: - null message: type: string examples: - 'Account not found.' examples: - - field: null message: 'Account not found.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: ACCOUNT_NOT_FOUND message: 'Account not found.' data: null errors: - field: null message: 'Account not found.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' 422: description: '' content: application/json: schema: oneOf: - description: 'Validation Error' type: object properties: status: type: string examples: - VALIDATION_ERROR message: type: string examples: - 'The given data was invalid.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: string examples: - password message: type: string examples: - 'The password must be at least 8 characters.' examples: - - field: password message: 'The password must be at least 8 characters.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: VALIDATION_ERROR message: 'The given data was invalid.' data: null errors: - field: password message: 'The password must be at least 8 characters.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' - description: 'Password Reuse' type: object properties: status: type: string examples: - VALIDATION_ERROR message: type: string examples: - 'The given data was invalid.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: string examples: - password message: type: string examples: - 'You cannot reuse your last 3 passwords.' examples: - - field: password message: 'You cannot reuse your last 3 passwords.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: VALIDATION_ERROR message: 'The given data was invalid.' data: null errors: - field: password message: 'You cannot reuse your last 3 passwords.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' 429: description: 'Rate Limited' content: application/json: schema: type: object properties: status: type: string examples: - RATE_LIMITED message: type: string examples: - 'Too many requests.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: - string - 'null' examples: - null message: type: string examples: - 'Too many requests.' examples: - - field: null message: 'Too many requests.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-21T19:00:00.000000Z' examples: - status: RATE_LIMITED message: 'Too many requests.' data: null errors: - field: null message: 'Too many requests.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-21T19:00:00.000000Z' tags: - 'Organization API' requestBody: required: true content: application/json: schema: type: object properties: email: type: string description: 'Email address for account.' examples: - boris@example.com reset_token: type: string description: 'UUID from verify-reset-code step.' examples: - a1b2c3d4-e5f6-7890-abcd-ef1234567890 password: type: string description: 'New password (min 8, must be confirmed).' examples: - NewPassword123 password_confirmation: type: string description: 'Password confirmation.' examples: - NewPassword123 guard: type: string description: 'Actor type ("user", "organization", or "admin").' examples: - user required: - email - reset_token - password - password_confirmation - guard security: [] /api/v1/mobile/auth/two-factor/challenge: post: summary: 'Two Factor Challenge' operationId: twoFactorChallenge description: 'Completes the two-factor authentication challenge for any guard.' parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS message: type: string examples: - 'Two-factor authentication verified successfully.' data: type: object properties: token: type: string examples: - 42|wMrUbv7gI4CRWxcRbQIldttPzbyXBl2z181bI8Yt86612731 refresh_token: type: string examples: - 43|VPtqTDVPb3gY2MF4mIkms7vJcLWgUA47iwIxRI8e34e4f629 expires_in: type: integer examples: - 900 user: type: object properties: id: type: string examples: - 019fd2b8-b86e-738d-8bfa-a29262a83558 email: type: string examples: - hansen.mohammad@example.org errors: type: - string - 'null' examples: - null meta: type: object properties: request_id: type: string examples: - 0ff1a162-0832-4ffa-9700-d0f30d00a580 timestamp: type: string examples: - '2026-08-05T16:19:09.319799Z' examples: - status: SUCCESS message: 'Two-factor authentication verified successfully.' data: token: 42|wMrUbv7gI4CRWxcRbQIldttPzbyXBl2z181bI8Yt86612731 refresh_token: 43|VPtqTDVPb3gY2MF4mIkms7vJcLWgUA47iwIxRI8e34e4f629 expires_in: 900 user: id: 019fd2b8-b86e-738d-8bfa-a29262a83558 email: hansen.mohammad@example.org errors: null meta: request_id: 0ff1a162-0832-4ffa-9700-d0f30d00a580 timestamp: '2026-08-05T16:19:09.319799Z' 401: description: '' content: application/json: schema: oneOf: - description: 'Invalid Code' type: object properties: status: type: string examples: - TWO_FACTOR_CODE_INVALID message: type: string examples: - 'The provided code is invalid or has expired.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: string examples: - code message: type: string examples: - 'The provided code is invalid or has expired.' examples: - - field: code message: 'The provided code is invalid or has expired.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: TWO_FACTOR_CODE_INVALID message: 'The provided code is invalid or has expired.' data: null errors: - field: code message: 'The provided code is invalid or has expired.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' - description: Unauthenticated type: object properties: status: type: string examples: - UNAUTHORIZED message: type: string examples: - Unauthenticated. data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: - string - 'null' examples: - null message: type: string examples: - Unauthenticated. examples: - - field: null message: Unauthenticated. meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: UNAUTHORIZED message: Unauthenticated. data: null errors: - field: null message: Unauthenticated. meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' 409: description: '2FA Not Configured' content: application/json: schema: type: object properties: status: type: string examples: - TWO_FACTOR_NOT_CONFIGURED message: type: string examples: - 'Two-factor authentication is not configured for this account.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: - string - 'null' examples: - null message: type: string examples: - 'Two-factor authentication is not configured for this account.' examples: - - field: null message: 'Two-factor authentication is not configured for this account.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: TWO_FACTOR_NOT_CONFIGURED message: 'Two-factor authentication is not configured for this account.' data: null errors: - field: null message: 'Two-factor authentication is not configured for this account.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' 422: description: 'Validation Error' content: application/json: schema: type: object properties: status: type: string examples: - VALIDATION_ERROR message: type: string examples: - 'The given data was invalid.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: string examples: - code message: type: string examples: - 'Either code or recovery_code is required.' examples: - - field: code message: 'Either code or recovery_code is required.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: VALIDATION_ERROR message: 'The given data was invalid.' data: null errors: - field: code message: 'Either code or recovery_code is required.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' 429: description: 'Rate Limited' content: application/json: schema: type: object properties: status: type: string examples: - RATE_LIMITED message: type: string examples: - 'Too many requests.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: - string - 'null' examples: - null message: type: string examples: - 'Too many requests.' examples: - - field: null message: 'Too many requests.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-21T19:00:00.000000Z' examples: - status: RATE_LIMITED message: 'Too many requests.' data: null errors: - field: null message: 'Too many requests.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-21T19:00:00.000000Z' tags: - 'Organization API' requestBody: required: false content: application/json: schema: type: object properties: code: type: - string - 'null' description: 'The OTP or TOTP code. Nullable if recovery_code is provided.' examples: - '123456' recovery_code: type: - string - 'null' description: 'The recovery code. Nullable if code is provided.' examples: - ABCD-1234-EFGH /api/v1/mobile/auth/logout: post: summary: Logout operationId: logout description: 'Revokes the currently active Sanctum token for any guard.' parameters: [] responses: 204: description: Success content: text/plain: schema: type: string examples: - '' 401: description: Unauthenticated content: application/json: schema: type: object properties: status: type: string examples: - UNAUTHORIZED message: type: string examples: - Unauthenticated. data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: - string - 'null' examples: - null message: type: string examples: - Unauthenticated. examples: - - field: null message: Unauthenticated. meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: UNAUTHORIZED message: Unauthenticated. data: null errors: - field: null message: Unauthenticated. meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' 429: description: 'Rate Limited' content: application/json: schema: type: object properties: status: type: string examples: - RATE_LIMITED message: type: string examples: - 'Too many requests.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: - string - 'null' examples: - null message: type: string examples: - 'Too many requests.' examples: - - field: null message: 'Too many requests.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-21T19:00:00.000000Z' examples: - status: RATE_LIMITED message: 'Too many requests.' data: null errors: - field: null message: 'Too many requests.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-21T19:00:00.000000Z' tags: - 'Organization API' /api/v1/mobile/auth/two-factor/enable: post: summary: 'Enable Two Factor' operationId: enableTwoFactor description: 'Initiates the 2FA setup flow for the authenticated user.' parameters: [] responses: 200: description: '' content: application/json: schema: oneOf: - description: Email type: object properties: status: type: string examples: - SUCCESS message: type: string examples: - 'Two-factor authentication initiated.' data: type: object properties: method: type: string examples: - email errors: type: - string - 'null' examples: - null meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: SUCCESS message: 'Two-factor authentication initiated.' data: method: email errors: null meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' - description: 'Recorded from a live call' type: object properties: status: type: string examples: - SUCCESS message: type: string examples: - 'Scan the QR code with your authenticator app, then confirm with the generated code.' data: type: object properties: method: type: string examples: - totp secret: type: string examples: - 6RL4HDCP2F4CDU27SRQOWOS454GFGIL6 qr_uri: type: string examples: - 'otpauth://totp/Flexxer%20Backend:019fd2b8-b36f-7307-92fb-5d28e58ef9f2?secret=6RL4HDCP2F4CDU27SRQOWOS454GFGIL6&issuer=Flexxer%20Backend&algorithm=SHA1&digits=6&period=30' errors: type: - string - 'null' examples: - null meta: type: object properties: request_id: type: string examples: - e9e9b449-d901-409b-a9b4-fd071002aa0e timestamp: type: string examples: - '2026-08-05T16:19:07.791377Z' examples: - status: SUCCESS message: 'Scan the QR code with your authenticator app, then confirm with the generated code.' data: method: totp secret: 6RL4HDCP2F4CDU27SRQOWOS454GFGIL6 qr_uri: 'otpauth://totp/Flexxer%20Backend:019fd2b8-b36f-7307-92fb-5d28e58ef9f2?secret=6RL4HDCP2F4CDU27SRQOWOS454GFGIL6&issuer=Flexxer%20Backend&algorithm=SHA1&digits=6&period=30' errors: null meta: request_id: e9e9b449-d901-409b-a9b4-fd071002aa0e timestamp: '2026-08-05T16:19:07.791377Z' 401: description: Unauthenticated content: application/json: schema: type: object properties: status: type: string examples: - UNAUTHORIZED message: type: string examples: - Unauthenticated. data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: - string - 'null' examples: - null message: type: string examples: - Unauthenticated. examples: - - field: null message: Unauthenticated. meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: UNAUTHORIZED message: Unauthenticated. data: null errors: - field: null message: Unauthenticated. meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' 422: description: 'Validation Error' content: application/json: schema: type: object properties: status: type: string examples: - VALIDATION_ERROR message: type: string examples: - 'The given data was invalid.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: string examples: - method message: type: string examples: - 'The selected method is invalid.' examples: - - field: method message: 'The selected method is invalid.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: VALIDATION_ERROR message: 'The given data was invalid.' data: null errors: - field: method message: 'The selected method is invalid.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' 429: description: 'Rate Limited' content: application/json: schema: type: object properties: status: type: string examples: - RATE_LIMITED message: type: string examples: - 'Too many requests.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: - string - 'null' examples: - null message: type: string examples: - 'Too many requests.' examples: - - field: null message: 'Too many requests.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-21T19:00:00.000000Z' examples: - status: RATE_LIMITED message: 'Too many requests.' data: null errors: - field: null message: 'Too many requests.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-21T19:00:00.000000Z' tags: - 'Organization API' requestBody: required: true content: application/json: schema: type: object properties: method: type: string description: 'The 2FA method to enable.' enum: - email - 'totp. Allowed: email' - totp examples: - totp required: - method /api/v1/mobile/auth/two-factor/confirm: post: summary: 'Confirm Two Factor' operationId: confirmTwoFactor description: 'Confirms and activates 2FA after the user has verified their code.' parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS message: type: string examples: - 'Two-factor authentication has been enabled. Save your recovery codes in a safe place.' data: type: object properties: recovery_codes: type: array items: type: string examples: - - DTPLO-U2SCF - MRWS1-IKBUY - MVM4F-Z42ES - AUSXU-FTDPK - U7WHX-TIU99 - 12AWU-NZVH6 - ZY5XK-4WOKJ - 47MAL-ZSDLU errors: type: - string - 'null' examples: - null meta: type: object properties: request_id: type: string examples: - 315aafcb-764e-4f38-9faa-b9c4f45e3461 timestamp: type: string examples: - '2026-08-05T16:19:07.807225Z' examples: - status: SUCCESS message: 'Two-factor authentication has been enabled. Save your recovery codes in a safe place.' data: recovery_codes: - DTPLO-U2SCF - MRWS1-IKBUY - MVM4F-Z42ES - AUSXU-FTDPK - U7WHX-TIU99 - 12AWU-NZVH6 - ZY5XK-4WOKJ - 47MAL-ZSDLU errors: null meta: request_id: 315aafcb-764e-4f38-9faa-b9c4f45e3461 timestamp: '2026-08-05T16:19:07.807225Z' 401: description: '' content: application/json: schema: oneOf: - description: 'Invalid Code' type: object properties: status: type: string examples: - TWO_FACTOR_CODE_INVALID message: type: string examples: - 'The provided code is invalid or has expired.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: string examples: - code message: type: string examples: - 'The provided code is invalid or has expired.' examples: - - field: code message: 'The provided code is invalid or has expired.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: TWO_FACTOR_CODE_INVALID message: 'The provided code is invalid or has expired.' data: null errors: - field: code message: 'The provided code is invalid or has expired.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' - description: Unauthenticated type: object properties: status: type: string examples: - UNAUTHORIZED message: type: string examples: - Unauthenticated. data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: - string - 'null' examples: - null message: type: string examples: - Unauthenticated. examples: - - field: null message: Unauthenticated. meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: UNAUTHORIZED message: Unauthenticated. data: null errors: - field: null message: Unauthenticated. meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' 409: description: 'No Pending Setup' content: application/json: schema: type: object properties: status: type: string examples: - TWO_FACTOR_NO_PENDING_SETUP message: type: string examples: - 'No pending two-factor setup found. Please restart the setup process.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: - string - 'null' examples: - null message: type: string examples: - 'No pending two-factor setup found. Please restart the setup process.' examples: - - field: null message: 'No pending two-factor setup found. Please restart the setup process.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: TWO_FACTOR_NO_PENDING_SETUP message: 'No pending two-factor setup found. Please restart the setup process.' data: null errors: - field: null message: 'No pending two-factor setup found. Please restart the setup process.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' 422: description: 'Validation Error' content: application/json: schema: type: object properties: status: type: string examples: - VALIDATION_ERROR message: type: string examples: - 'The given data was invalid.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: string examples: - code message: type: string examples: - 'The code field is required.' examples: - - field: code message: 'The code field is required.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: VALIDATION_ERROR message: 'The given data was invalid.' data: null errors: - field: code message: 'The code field is required.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' 429: description: 'Rate Limited' content: application/json: schema: type: object properties: status: type: string examples: - RATE_LIMITED message: type: string examples: - 'Too many requests.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: - string - 'null' examples: - null message: type: string examples: - 'Too many requests.' examples: - - field: null message: 'Too many requests.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-21T19:00:00.000000Z' examples: - status: RATE_LIMITED message: 'Too many requests.' data: null errors: - field: null message: 'Too many requests.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-21T19:00:00.000000Z' tags: - 'Organization API' requestBody: required: true content: application/json: schema: type: object properties: code: type: string description: 'The OTP or TOTP code to verify.' examples: - '123456' required: - code /api/v1/mobile/auth/two-factor/disable/request-code: post: summary: 'Request Disable Two Factor Code' operationId: requestDisableTwoFactorCode description: "Dispatches a 6-digit OTP to the user's account email so they can\nconfirm a 2FA-disable request. No-op for TOTP accounts (the code\ncomes from the authenticator app directly) and for accounts without\nan enabled 2FA setting — both return 200 so the client's happy path\nis uniform." parameters: [] responses: 200: description: '' content: application/json: schema: oneOf: - description: 'TOTP — use authenticator' type: object properties: status: type: string examples: - SUCCESS message: type: string examples: - 'Enter the current code from your authenticator app.' data: type: object properties: method: type: string examples: - totp errors: type: - string - 'null' examples: - null meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-22T12:00:00.000000Z' examples: - status: SUCCESS message: 'Enter the current code from your authenticator app.' data: method: totp errors: null meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-22T12:00:00.000000Z' - description: 'Recorded from a live call' type: object properties: status: type: string examples: - SUCCESS message: type: string examples: - 'Enter the current code from your authenticator app.' data: type: object properties: method: type: string examples: - totp errors: type: - string - 'null' examples: - null meta: type: object properties: request_id: type: string examples: - 0542b19f-0c0a-4bf3-93a4-d90bbac46f63 timestamp: type: string examples: - '2026-08-05T16:18:37.138042Z' examples: - status: SUCCESS message: 'Enter the current code from your authenticator app.' data: method: totp errors: null meta: request_id: 0542b19f-0c0a-4bf3-93a4-d90bbac46f63 timestamp: '2026-08-05T16:18:37.138042Z' 409: description: 'Not Enabled' content: application/json: schema: type: object properties: status: type: string examples: - TWO_FACTOR_NOT_ENABLED message: type: string examples: - 'Two-factor authentication is not currently enabled.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: - string - 'null' examples: - null message: type: string examples: - 'Two-factor authentication is not currently enabled.' examples: - - field: null message: 'Two-factor authentication is not currently enabled.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-22T12:00:00.000000Z' examples: - status: TWO_FACTOR_NOT_ENABLED message: 'Two-factor authentication is not currently enabled.' data: null errors: - field: null message: 'Two-factor authentication is not currently enabled.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-22T12:00:00.000000Z' tags: - 'Organization API' /api/v1/mobile/auth/two-factor/disable: delete: summary: 'Disable Two Factor' operationId: disableTwoFactor description: "Disables 2FA for the authenticated user after verifying a current\nchallenge code — the same proof the user provides at login time." parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS message: type: string examples: - 'Two-factor authentication has been disabled.' data: type: - string - 'null' examples: - null errors: type: - string - 'null' examples: - null meta: type: object properties: request_id: type: string examples: - 255f0d6e-8c58-4e47-84a4-c47dd821febf timestamp: type: string examples: - '2026-08-05T16:19:07.817111Z' examples: - status: SUCCESS message: 'Two-factor authentication has been disabled.' data: null errors: null meta: request_id: 255f0d6e-8c58-4e47-84a4-c47dd821febf timestamp: '2026-08-05T16:19:07.817111Z' 401: description: 'Invalid Code' content: application/json: schema: type: object properties: status: type: string examples: - TWO_FACTOR_CODE_INVALID message: type: string examples: - 'The provided code is invalid or has expired.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: string examples: - code message: type: string examples: - 'The provided code is invalid or has expired.' examples: - - field: code message: 'The provided code is invalid or has expired.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-22T12:00:00.000000Z' examples: - status: TWO_FACTOR_CODE_INVALID message: 'The provided code is invalid or has expired.' data: null errors: - field: code message: 'The provided code is invalid or has expired.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-22T12:00:00.000000Z' 409: description: 'Not Enabled' content: application/json: schema: type: object properties: status: type: string examples: - TWO_FACTOR_NOT_ENABLED message: type: string examples: - 'Two-factor authentication is not currently enabled.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: - string - 'null' examples: - null message: type: string examples: - 'Two-factor authentication is not currently enabled.' examples: - - field: null message: 'Two-factor authentication is not currently enabled.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-22T12:00:00.000000Z' examples: - status: TWO_FACTOR_NOT_ENABLED message: 'Two-factor authentication is not currently enabled.' data: null errors: - field: null message: 'Two-factor authentication is not currently enabled.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-22T12:00:00.000000Z' 422: description: 'Validation Error' content: application/json: schema: type: object properties: status: type: string examples: - VALIDATION_ERROR message: type: string examples: - 'The given data was invalid.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: string examples: - code message: type: string examples: - 'Either code or recovery_code is required.' examples: - - field: code message: 'Either code or recovery_code is required.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-22T12:00:00.000000Z' examples: - status: VALIDATION_ERROR message: 'The given data was invalid.' data: null errors: - field: code message: 'Either code or recovery_code is required.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-22T12:00:00.000000Z' tags: - 'Organization API' requestBody: required: false content: application/json: schema: type: object properties: code: type: - string - 'null' description: '6-digit TOTP or email OTP. Required unless `recovery_code` is provided.' examples: - '123456' recovery_code: type: - string - 'null' description: 'Recovery code in place of `code`.' examples: - ABCD-1234-EFGH /api/v1/mobile/sessions: get: summary: 'List Sessions' operationId: listSessions description: "Lists the authenticated user's (or org's, or admin's) active\nSanctum sessions with their device metadata, sorted by last_used_at\ndescending so the most recently active device is first." parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS message: type: string examples: - Success data: type: array items: type: object properties: id: type: integer examples: - 4 name: type: string examples: - docs device: type: - string - 'null' examples: - null ip_address: type: - string - 'null' examples: - null last_used_at: type: string examples: - '2026-08-05T16:18:37+00:00' expires_at: type: - string - 'null' examples: - null created_at: type: string examples: - '2026-08-05T16:18:33+00:00' is_current: type: boolean examples: - true examples: - - id: 4 name: docs device: null ip_address: null last_used_at: '2026-08-05T16:18:37+00:00' expires_at: null created_at: '2026-08-05T16:18:33+00:00' is_current: true errors: type: - string - 'null' examples: - null meta: type: object properties: request_id: type: string examples: - b9c7f080-de76-4ae2-92d4-98f5f9c63e35 timestamp: type: string examples: - '2026-08-05T16:18:37.159008Z' examples: - status: SUCCESS message: Success data: - id: 4 name: docs device: null ip_address: null last_used_at: '2026-08-05T16:18:37+00:00' expires_at: null created_at: '2026-08-05T16:18:33+00:00' is_current: true errors: null meta: request_id: b9c7f080-de76-4ae2-92d4-98f5f9c63e35 timestamp: '2026-08-05T16:18:37.159008Z' 401: description: Unauthenticated content: application/json: schema: type: object properties: status: type: string examples: - UNAUTHENTICATED message: type: string examples: - Unauthenticated. data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: - string - 'null' examples: - null message: type: string examples: - Unauthenticated. examples: - - field: null message: Unauthenticated. meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-21T19:00:00.000000Z' examples: - status: UNAUTHENTICATED message: Unauthenticated. data: null errors: - field: null message: Unauthenticated. meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-21T19:00:00.000000Z' tags: - 'Organization API' delete: summary: 'Revoke Other Sessions' operationId: revokeOtherSessions description: "Logs out every OTHER active session of the authenticated caller,\nkeeping the current one alive (\"Alle anderen Geräte abmelden\")." parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS message: type: string examples: - Success data: type: object properties: revoked: type: integer examples: - 0 errors: type: - string - 'null' examples: - null meta: type: object properties: request_id: type: string examples: - 99342b48-bea9-49b3-a788-41e38c4c0892 timestamp: type: string examples: - '2026-08-05T16:18:37.170260Z' examples: - status: SUCCESS message: Success data: revoked: 0 errors: null meta: request_id: 99342b48-bea9-49b3-a788-41e38c4c0892 timestamp: '2026-08-05T16:18:37.170260Z' 401: description: Unauthenticated content: application/json: schema: type: object properties: status: type: string examples: - UNAUTHENTICATED message: type: string examples: - Unauthenticated. data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: - string - 'null' examples: - null message: type: string examples: - Unauthenticated. examples: - - field: null message: Unauthenticated. meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-06-18T12:00:00.000000Z' examples: - status: UNAUTHENTICATED message: Unauthenticated. data: null errors: - field: null message: Unauthenticated. meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-06-18T12:00:00.000000Z' tags: - 'Organization API' '/api/v1/mobile/sessions/{tokenId}': delete: summary: 'Revoke Session' operationId: revokeSession description: 'Revokes a single active session by id.' parameters: [] responses: 204: description: Revoked content: text/plain: schema: type: string examples: - '' 401: description: Unauthenticated content: application/json: schema: type: object properties: status: type: string examples: - UNAUTHENTICATED message: type: string examples: - Unauthenticated. data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: - string - 'null' examples: - null message: type: string examples: - Unauthenticated. examples: - - field: null message: Unauthenticated. meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-21T19:00:00.000000Z' examples: - status: UNAUTHENTICATED message: Unauthenticated. data: null errors: - field: null message: Unauthenticated. meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-21T19:00:00.000000Z' 404: description: 'Not Found' content: application/json: schema: type: object properties: status: type: string examples: - NOT_FOUND message: type: string examples: - 'Session not found.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: - string - 'null' examples: - null message: type: string examples: - 'Session not found.' examples: - - field: null message: 'Session not found.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: NOT_FOUND message: 'Session not found.' data: null errors: - field: null message: 'Session not found.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' 429: description: 'Rate Limited' content: application/json: schema: type: object properties: status: type: string examples: - RATE_LIMITED message: type: string examples: - 'Too many requests.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: - string - 'null' examples: - null message: type: string examples: - 'Too many requests.' examples: - - field: null message: 'Too many requests.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-21T19:00:00.000000Z' examples: - status: RATE_LIMITED message: 'Too many requests.' data: null errors: - field: null message: 'Too many requests.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-21T19:00:00.000000Z' tags: - 'Organization API' parameters: - in: path name: tokenId description: 'Identifier from the collection.' required: true schema: type: string examples: - 019f9939-c4c3-70fb-a54e-5ebf63db36d2 - in: path name: sessionId description: 'The ID of the session to revoke.' required: true schema: type: integer examples: - 16 /api/v1/org/auth/forgot-password: post: summary: 'Forgot Password' operationId: forgotPassword description: 'Sends a 4-digit password reset code to the given email address.' parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS message: type: string examples: - 'If that email address is registered, a password reset code has been sent.' data: type: object properties: email: type: string examples: - opal56@example.net code: type: string examples: - '448891' errors: type: - string - 'null' examples: - null meta: type: object properties: request_id: type: string examples: - 04e13c3e-6945-4f40-bb63-a330434430e3 timestamp: type: string examples: - '2026-08-05T16:18:54.164086Z' examples: - status: SUCCESS message: 'If that email address is registered, a password reset code has been sent.' data: email: opal56@example.net code: '448891' errors: null meta: request_id: 04e13c3e-6945-4f40-bb63-a330434430e3 timestamp: '2026-08-05T16:18:54.164086Z' 422: description: 'Validation Error' content: application/json: schema: type: object properties: status: type: string examples: - VALIDATION_ERROR message: type: string examples: - 'The given data was invalid.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: string examples: - guard message: type: string examples: - 'The guard field is required.' examples: - - field: guard message: 'The guard field is required.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: VALIDATION_ERROR message: 'The given data was invalid.' data: null errors: - field: guard message: 'The guard field is required.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' 429: description: 'Rate Limited' content: application/json: schema: type: object properties: status: type: string examples: - RATE_LIMITED message: type: string examples: - 'Too many requests.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: - string - 'null' examples: - null message: type: string examples: - 'Too many requests.' examples: - - field: null message: 'Too many requests.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-21T19:00:00.000000Z' examples: - status: RATE_LIMITED message: 'Too many requests.' data: null errors: - field: null message: 'Too many requests.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-21T19:00:00.000000Z' tags: - 'Organization API' requestBody: required: true content: application/json: schema: type: object properties: email: type: string description: 'Email address to send reset code to.' examples: - boris@example.com guard: type: string description: 'Actor type ("user", "organization", or "admin").' examples: - user required: - email - guard security: [] /api/v1/org/auth/forgot-password/verify: post: summary: 'Verify Reset Code' operationId: verifyResetCode description: 'Validates the 4-digit password reset code for the given email and guard.' parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS message: type: string examples: - 'Reset code verified successfully.' data: type: object properties: reset_token: type: string examples: - c97701d0-c4de-4755-b3c4-f7d1a803efc5 errors: type: - string - 'null' examples: - null meta: type: object properties: request_id: type: string examples: - 67df2724-9771-46b5-8d4d-71f98573d3e5 timestamp: type: string examples: - '2026-08-05T16:18:54.166696Z' examples: - status: SUCCESS message: 'Reset code verified successfully.' data: reset_token: c97701d0-c4de-4755-b3c4-f7d1a803efc5 errors: null meta: request_id: 67df2724-9771-46b5-8d4d-71f98573d3e5 timestamp: '2026-08-05T16:18:54.166696Z' 401: description: 'Invalid Code' content: application/json: schema: type: object properties: status: type: string examples: - RESET_CODE_INVALID message: type: string examples: - 'Invalid reset code.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: string examples: - code message: type: string examples: - 'Invalid reset code.' examples: - - field: code message: 'Invalid reset code.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: RESET_CODE_INVALID message: 'Invalid reset code.' data: null errors: - field: code message: 'Invalid reset code.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' 410: description: 'Code Expired' content: application/json: schema: type: object properties: status: type: string examples: - RESET_CODE_EXPIRED message: type: string examples: - 'Reset code has expired.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: string examples: - code message: type: string examples: - 'Reset code has expired.' examples: - - field: code message: 'Reset code has expired.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: RESET_CODE_EXPIRED message: 'Reset code has expired.' data: null errors: - field: code message: 'Reset code has expired.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' 422: description: 'Validation Error' content: application/json: schema: type: object properties: status: type: string examples: - VALIDATION_ERROR message: type: string examples: - 'The given data was invalid.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: string examples: - code message: type: string examples: - 'The code field is required.' examples: - - field: code message: 'The code field is required.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: VALIDATION_ERROR message: 'The given data was invalid.' data: null errors: - field: code message: 'The code field is required.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' 429: description: 'Too Many Attempts' content: application/json: schema: type: object properties: status: type: string examples: - RESET_ATTEMPTS_EXHAUSTED message: type: string examples: - 'Too many failed attempts. Please request a new code.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: string examples: - code message: type: string examples: - 'Too many failed attempts. Please request a new code.' examples: - - field: code message: 'Too many failed attempts. Please request a new code.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: RESET_ATTEMPTS_EXHAUSTED message: 'Too many failed attempts. Please request a new code.' data: null errors: - field: code message: 'Too many failed attempts. Please request a new code.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' tags: - 'Organization API' requestBody: required: true content: application/json: schema: type: object properties: email: type: string description: 'Email address for password reset.' examples: - boris@example.com code: type: string description: '6-digit reset code.' examples: - '123456' guard: type: string description: 'Actor type ("user", "organization", or "admin").' examples: - user required: - email - code - guard security: [] /api/v1/org/auth/forgot-password/resend: post: summary: 'Resend Reset Code' operationId: resendResetCode description: 'Re-sends a 4-digit password reset code for the given email and guard.' parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS message: type: string examples: - 'If that email address is registered, a new password reset code has been sent.' data: type: object properties: code: type: string examples: - '443677' errors: type: - string - 'null' examples: - null meta: type: object properties: request_id: type: string examples: - a265e26e-388c-4782-b9ce-bc4722cc5958 timestamp: type: string examples: - '2026-08-05T16:18:58.095803Z' examples: - status: SUCCESS message: 'If that email address is registered, a new password reset code has been sent.' data: code: '443677' errors: null meta: request_id: a265e26e-388c-4782-b9ce-bc4722cc5958 timestamp: '2026-08-05T16:18:58.095803Z' 422: description: 'Validation Error' content: application/json: schema: type: object properties: status: type: string examples: - VALIDATION_ERROR message: type: string examples: - 'The given data was invalid.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: string examples: - guard message: type: string examples: - 'The guard field is required.' examples: - - field: guard message: 'The guard field is required.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: VALIDATION_ERROR message: 'The given data was invalid.' data: null errors: - field: guard message: 'The guard field is required.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' 429: description: 'Rate Limited' content: application/json: schema: type: object properties: status: type: string examples: - RATE_LIMITED message: type: string examples: - 'Too many requests.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: - string - 'null' examples: - null message: type: string examples: - 'Too many requests.' examples: - - field: null message: 'Too many requests.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-21T19:00:00.000000Z' examples: - status: RATE_LIMITED message: 'Too many requests.' data: null errors: - field: null message: 'Too many requests.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-21T19:00:00.000000Z' tags: - 'Organization API' requestBody: required: true content: application/json: schema: type: object properties: email: type: string description: 'Email address to resend reset code to.' examples: - boris@example.com guard: type: string description: 'Actor type ("user", "organization", or "admin").' examples: - user required: - email - guard security: [] /api/v1/org/auth/reset-password: post: summary: 'Reset Password' operationId: resetPassword description: 'Resets the password for any actor type and revokes all existing tokens.' parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS message: type: string examples: - 'Password has been reset successfully.' data: type: - string - 'null' examples: - null errors: type: - string - 'null' examples: - null meta: type: object properties: request_id: type: string examples: - 85c34424-2c5f-4d2e-aa97-5edf63d5d429 timestamp: type: string examples: - '2026-08-05T16:18:54.626775Z' examples: - status: SUCCESS message: 'Password has been reset successfully.' data: null errors: null meta: request_id: 85c34424-2c5f-4d2e-aa97-5edf63d5d429 timestamp: '2026-08-05T16:18:54.626775Z' 403: description: 'Email Not Verified' content: application/json: schema: type: object properties: status: type: string examples: - RESET_NOT_VERIFIED message: type: string examples: - 'Email not verified. Complete the verification step first.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: - string - 'null' examples: - null message: type: string examples: - 'Email not verified. Complete the verification step first.' examples: - - field: null message: 'Email not verified. Complete the verification step first.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: RESET_NOT_VERIFIED message: 'Email not verified. Complete the verification step first.' data: null errors: - field: null message: 'Email not verified. Complete the verification step first.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' 404: description: 'Account Not Found' content: application/json: schema: type: object properties: status: type: string examples: - ACCOUNT_NOT_FOUND message: type: string examples: - 'Account not found.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: - string - 'null' examples: - null message: type: string examples: - 'Account not found.' examples: - - field: null message: 'Account not found.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: ACCOUNT_NOT_FOUND message: 'Account not found.' data: null errors: - field: null message: 'Account not found.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' 422: description: '' content: application/json: schema: oneOf: - description: 'Validation Error' type: object properties: status: type: string examples: - VALIDATION_ERROR message: type: string examples: - 'The given data was invalid.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: string examples: - password message: type: string examples: - 'The password must be at least 8 characters.' examples: - - field: password message: 'The password must be at least 8 characters.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: VALIDATION_ERROR message: 'The given data was invalid.' data: null errors: - field: password message: 'The password must be at least 8 characters.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' - description: 'Password Reuse' type: object properties: status: type: string examples: - VALIDATION_ERROR message: type: string examples: - 'The given data was invalid.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: string examples: - password message: type: string examples: - 'You cannot reuse your last 3 passwords.' examples: - - field: password message: 'You cannot reuse your last 3 passwords.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: VALIDATION_ERROR message: 'The given data was invalid.' data: null errors: - field: password message: 'You cannot reuse your last 3 passwords.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' 429: description: 'Rate Limited' content: application/json: schema: type: object properties: status: type: string examples: - RATE_LIMITED message: type: string examples: - 'Too many requests.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: - string - 'null' examples: - null message: type: string examples: - 'Too many requests.' examples: - - field: null message: 'Too many requests.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-21T19:00:00.000000Z' examples: - status: RATE_LIMITED message: 'Too many requests.' data: null errors: - field: null message: 'Too many requests.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-21T19:00:00.000000Z' tags: - 'Organization API' requestBody: required: true content: application/json: schema: type: object properties: email: type: string description: 'Email address for account.' examples: - boris@example.com reset_token: type: string description: 'UUID from verify-reset-code step.' examples: - a1b2c3d4-e5f6-7890-abcd-ef1234567890 password: type: string description: 'New password (min 8, must be confirmed).' examples: - NewPassword123 password_confirmation: type: string description: 'Password confirmation.' examples: - NewPassword123 guard: type: string description: 'Actor type ("user", "organization", or "admin").' examples: - user required: - email - reset_token - password - password_confirmation - guard security: [] /api/v1/org/auth/two-factor/challenge: post: summary: 'Two Factor Challenge' operationId: twoFactorChallenge description: 'Completes the two-factor authentication challenge for any guard.' parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS message: type: string examples: - 'Two-factor authentication verified successfully.' data: type: object properties: token: type: string examples: - 42|wMrUbv7gI4CRWxcRbQIldttPzbyXBl2z181bI8Yt86612731 refresh_token: type: string examples: - 43|VPtqTDVPb3gY2MF4mIkms7vJcLWgUA47iwIxRI8e34e4f629 expires_in: type: integer examples: - 900 user: type: object properties: id: type: string examples: - 019fd2b8-b86e-738d-8bfa-a29262a83558 email: type: string examples: - hansen.mohammad@example.org errors: type: - string - 'null' examples: - null meta: type: object properties: request_id: type: string examples: - 0ff1a162-0832-4ffa-9700-d0f30d00a580 timestamp: type: string examples: - '2026-08-05T16:19:09.319799Z' examples: - status: SUCCESS message: 'Two-factor authentication verified successfully.' data: token: 42|wMrUbv7gI4CRWxcRbQIldttPzbyXBl2z181bI8Yt86612731 refresh_token: 43|VPtqTDVPb3gY2MF4mIkms7vJcLWgUA47iwIxRI8e34e4f629 expires_in: 900 user: id: 019fd2b8-b86e-738d-8bfa-a29262a83558 email: hansen.mohammad@example.org errors: null meta: request_id: 0ff1a162-0832-4ffa-9700-d0f30d00a580 timestamp: '2026-08-05T16:19:09.319799Z' 401: description: '' content: application/json: schema: oneOf: - description: 'Invalid Code' type: object properties: status: type: string examples: - TWO_FACTOR_CODE_INVALID message: type: string examples: - 'The provided code is invalid or has expired.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: string examples: - code message: type: string examples: - 'The provided code is invalid or has expired.' examples: - - field: code message: 'The provided code is invalid or has expired.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: TWO_FACTOR_CODE_INVALID message: 'The provided code is invalid or has expired.' data: null errors: - field: code message: 'The provided code is invalid or has expired.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' - description: Unauthenticated type: object properties: status: type: string examples: - UNAUTHORIZED message: type: string examples: - Unauthenticated. data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: - string - 'null' examples: - null message: type: string examples: - Unauthenticated. examples: - - field: null message: Unauthenticated. meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: UNAUTHORIZED message: Unauthenticated. data: null errors: - field: null message: Unauthenticated. meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' 409: description: '2FA Not Configured' content: application/json: schema: type: object properties: status: type: string examples: - TWO_FACTOR_NOT_CONFIGURED message: type: string examples: - 'Two-factor authentication is not configured for this account.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: - string - 'null' examples: - null message: type: string examples: - 'Two-factor authentication is not configured for this account.' examples: - - field: null message: 'Two-factor authentication is not configured for this account.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: TWO_FACTOR_NOT_CONFIGURED message: 'Two-factor authentication is not configured for this account.' data: null errors: - field: null message: 'Two-factor authentication is not configured for this account.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' 422: description: 'Validation Error' content: application/json: schema: type: object properties: status: type: string examples: - VALIDATION_ERROR message: type: string examples: - 'The given data was invalid.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: string examples: - code message: type: string examples: - 'Either code or recovery_code is required.' examples: - - field: code message: 'Either code or recovery_code is required.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: VALIDATION_ERROR message: 'The given data was invalid.' data: null errors: - field: code message: 'Either code or recovery_code is required.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' 429: description: 'Rate Limited' content: application/json: schema: type: object properties: status: type: string examples: - RATE_LIMITED message: type: string examples: - 'Too many requests.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: - string - 'null' examples: - null message: type: string examples: - 'Too many requests.' examples: - - field: null message: 'Too many requests.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-21T19:00:00.000000Z' examples: - status: RATE_LIMITED message: 'Too many requests.' data: null errors: - field: null message: 'Too many requests.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-21T19:00:00.000000Z' tags: - 'Organization API' requestBody: required: false content: application/json: schema: type: object properties: code: type: - string - 'null' description: 'The OTP or TOTP code. Nullable if recovery_code is provided.' examples: - '123456' recovery_code: type: - string - 'null' description: 'The recovery code. Nullable if code is provided.' examples: - ABCD-1234-EFGH /api/v1/org/auth/member/two-factor/challenge: post: summary: 'Two Factor Challenge' operationId: twoFactorChallenge description: 'Completes the two-factor authentication challenge for any guard.' parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS message: type: string examples: - 'Two-factor authentication verified successfully.' data: type: object properties: token: type: string examples: - 42|wMrUbv7gI4CRWxcRbQIldttPzbyXBl2z181bI8Yt86612731 refresh_token: type: string examples: - 43|VPtqTDVPb3gY2MF4mIkms7vJcLWgUA47iwIxRI8e34e4f629 expires_in: type: integer examples: - 900 user: type: object properties: id: type: string examples: - 019fd2b8-b86e-738d-8bfa-a29262a83558 email: type: string examples: - hansen.mohammad@example.org errors: type: - string - 'null' examples: - null meta: type: object properties: request_id: type: string examples: - 0ff1a162-0832-4ffa-9700-d0f30d00a580 timestamp: type: string examples: - '2026-08-05T16:19:09.319799Z' examples: - status: SUCCESS message: 'Two-factor authentication verified successfully.' data: token: 42|wMrUbv7gI4CRWxcRbQIldttPzbyXBl2z181bI8Yt86612731 refresh_token: 43|VPtqTDVPb3gY2MF4mIkms7vJcLWgUA47iwIxRI8e34e4f629 expires_in: 900 user: id: 019fd2b8-b86e-738d-8bfa-a29262a83558 email: hansen.mohammad@example.org errors: null meta: request_id: 0ff1a162-0832-4ffa-9700-d0f30d00a580 timestamp: '2026-08-05T16:19:09.319799Z' 401: description: '' content: application/json: schema: oneOf: - description: 'Invalid Code' type: object properties: status: type: string examples: - TWO_FACTOR_CODE_INVALID message: type: string examples: - 'The provided code is invalid or has expired.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: string examples: - code message: type: string examples: - 'The provided code is invalid or has expired.' examples: - - field: code message: 'The provided code is invalid or has expired.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: TWO_FACTOR_CODE_INVALID message: 'The provided code is invalid or has expired.' data: null errors: - field: code message: 'The provided code is invalid or has expired.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' - description: Unauthenticated type: object properties: status: type: string examples: - UNAUTHORIZED message: type: string examples: - Unauthenticated. data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: - string - 'null' examples: - null message: type: string examples: - Unauthenticated. examples: - - field: null message: Unauthenticated. meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: UNAUTHORIZED message: Unauthenticated. data: null errors: - field: null message: Unauthenticated. meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' 409: description: '2FA Not Configured' content: application/json: schema: type: object properties: status: type: string examples: - TWO_FACTOR_NOT_CONFIGURED message: type: string examples: - 'Two-factor authentication is not configured for this account.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: - string - 'null' examples: - null message: type: string examples: - 'Two-factor authentication is not configured for this account.' examples: - - field: null message: 'Two-factor authentication is not configured for this account.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: TWO_FACTOR_NOT_CONFIGURED message: 'Two-factor authentication is not configured for this account.' data: null errors: - field: null message: 'Two-factor authentication is not configured for this account.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' 422: description: 'Validation Error' content: application/json: schema: type: object properties: status: type: string examples: - VALIDATION_ERROR message: type: string examples: - 'The given data was invalid.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: string examples: - code message: type: string examples: - 'Either code or recovery_code is required.' examples: - - field: code message: 'Either code or recovery_code is required.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: VALIDATION_ERROR message: 'The given data was invalid.' data: null errors: - field: code message: 'Either code or recovery_code is required.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' 429: description: 'Rate Limited' content: application/json: schema: type: object properties: status: type: string examples: - RATE_LIMITED message: type: string examples: - 'Too many requests.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: - string - 'null' examples: - null message: type: string examples: - 'Too many requests.' examples: - - field: null message: 'Too many requests.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-21T19:00:00.000000Z' examples: - status: RATE_LIMITED message: 'Too many requests.' data: null errors: - field: null message: 'Too many requests.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-21T19:00:00.000000Z' tags: - 'Organization API' requestBody: required: false content: application/json: schema: type: object properties: code: type: - string - 'null' description: 'The OTP or TOTP code. Nullable if recovery_code is provided.' examples: - '123456' recovery_code: type: - string - 'null' description: 'The recovery code. Nullable if code is provided.' examples: - ABCD-1234-EFGH /api/v1/org/auth/me: get: summary: 'Get Current Organization / Member' operationId: getCurrentOrganizationMember description: "Returns the authenticated actor's profile alongside an ACL manifest.\n\nTwo actor types share this route (both pass the `guard:organization`\nmiddleware):\n\n - Organization (principal): synthetic manifest built from the\n `principal` preset; no rows in acl_actor_presets are consulted.\n - OrganizationMember: real manifest resolved from the member's stored\n presets via `Acl::manifest($member)`." parameters: [] responses: 200: description: '' content: application/json: schema: oneOf: - description: OrganizationMember type: object properties: status: type: string examples: - SUCCESS message: type: string examples: - Success data: type: object properties: profile: type: object properties: id: type: string examples: - uuid name: type: string examples: - 'Jane Doe' email: type: string examples: - jane@example.com role: type: string examples: - member organization_id: type: string examples: - org-uuid organization_name: type: string examples: - 'Acme e.V.' is_primary_admin: type: boolean examples: - false acl: type: object properties: scope: type: string examples: - org-member presets: type: array items: type: string examples: - - viewer permissions: type: array items: type: string examples: - - profile.view - team.view conditional: type: object properties: { } computed_at: type: string examples: - '2026-05-12T10:00:00+00:00' examples: - status: SUCCESS message: Success data: profile: id: uuid name: 'Jane Doe' email: jane@example.com role: member organization_id: org-uuid organization_name: 'Acme e.V.' is_primary_admin: false acl: scope: org-member presets: - viewer permissions: - profile.view - team.view conditional: { } computed_at: '2026-05-12T10:00:00+00:00' - description: 'Recorded from a live call' type: object properties: status: type: string examples: - SUCCESS message: type: string examples: - Success data: type: object properties: profile: type: object properties: id: type: string examples: - 019fd2b7-f072-7154-8961-5b324cc6c46c name: type: string examples: - Caritas email: type: string examples: - caritas-portal@flexxr.eu.cc status: type: string examples: - active is_primary_admin: type: boolean examples: - true acl: type: object properties: scope: type: string examples: - org-member presets: type: array items: type: string examples: - - principal permissions: type: array items: type: string examples: - - applicants.accept - applicants.reject - applicants.view - assignments.manage - assignments.view - attendance.approve-hours - attendance.report-noshow - attendance.view - audit.view - gdpr.request - invoices.download - invoices.view - jobs.configure-assignment - jobs.create - jobs.delete - jobs.edit - jobs.publish - jobs.view - messages.access - notifications.preferences.manage - payments.manage - payments.view - profile.edit - profile.view - ratings.create - ratings.view - reports.export - reports.view - requests.decide - requests.view - shifts.adjust - shifts.cancel - shifts.check-in - shifts.dispute-time - shifts.generate-qr - shifts.report-signature-refusal - shifts.view - support.create-ticket - support.view-tickets - team.invite - team.manage-roles - team.remove - team.view conditional: type: object properties: { } computed_at: type: string examples: - '2026-08-05T16:18:37+00:00' errors: type: - string - 'null' examples: - null meta: type: object properties: request_id: type: string examples: - e4ea4c8e-c454-4449-891f-5f615816a929 timestamp: type: string examples: - '2026-08-05T16:18:37.721087Z' examples: - status: SUCCESS message: Success data: profile: id: 019fd2b7-f072-7154-8961-5b324cc6c46c name: Caritas email: caritas-portal@flexxr.eu.cc status: active is_primary_admin: true acl: scope: org-member presets: - principal permissions: - applicants.accept - applicants.reject - applicants.view - assignments.manage - assignments.view - attendance.approve-hours - attendance.report-noshow - attendance.view - audit.view - gdpr.request - invoices.download - invoices.view - jobs.configure-assignment - jobs.create - jobs.delete - jobs.edit - jobs.publish - jobs.view - messages.access - notifications.preferences.manage - payments.manage - payments.view - profile.edit - profile.view - ratings.create - ratings.view - reports.export - reports.view - requests.decide - requests.view - shifts.adjust - shifts.cancel - shifts.check-in - shifts.dispute-time - shifts.generate-qr - shifts.report-signature-refusal - shifts.view - support.create-ticket - support.view-tickets - team.invite - team.manage-roles - team.remove - team.view conditional: { } computed_at: '2026-08-05T16:18:37+00:00' errors: null meta: request_id: e4ea4c8e-c454-4449-891f-5f615816a929 timestamp: '2026-08-05T16:18:37.721087Z' tags: - 'Organization API' /api/v1/org/auth/logout: post: summary: Logout operationId: logout description: 'Revokes the currently active Sanctum token for any guard.' parameters: [] responses: 204: description: Success content: text/plain: schema: type: string examples: - '' 401: description: Unauthenticated content: application/json: schema: type: object properties: status: type: string examples: - UNAUTHORIZED message: type: string examples: - Unauthenticated. data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: - string - 'null' examples: - null message: type: string examples: - Unauthenticated. examples: - - field: null message: Unauthenticated. meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: UNAUTHORIZED message: Unauthenticated. data: null errors: - field: null message: Unauthenticated. meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' 429: description: 'Rate Limited' content: application/json: schema: type: object properties: status: type: string examples: - RATE_LIMITED message: type: string examples: - 'Too many requests.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: - string - 'null' examples: - null message: type: string examples: - 'Too many requests.' examples: - - field: null message: 'Too many requests.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-21T19:00:00.000000Z' examples: - status: RATE_LIMITED message: 'Too many requests.' data: null errors: - field: null message: 'Too many requests.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-21T19:00:00.000000Z' tags: - 'Organization API' /api/v1/org/profile/logo: post: summary: 'Upload Org Logo' operationId: uploadOrgLogo description: 'Stores a new logo file for the authenticated organisation, replacing any existing one and returning the updated profile.' parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS message: type: string examples: - 'Logo uploaded successfully.' data: type: object properties: id: type: string examples: - 019fd2b7-f072-7154-8961-5b324cc6c46c name: type: string examples: - Caritas slug: type: string examples: - caritas-4v1ues email: type: string examples: - caritas-portal@flexxr.eu.cc country_code: type: string examples: - '+43' phone_number: type: string examples: - '6641234567' contact_person_name: type: - string - 'null' examples: - null contact_person_phone: type: - string - 'null' examples: - null iso_country_code: type: string examples: - AT phone_e164: type: string examples: - '+436641234567' description: type: string examples: - 'Caritas test organisation used for end-to-end portal QA. Safe to delete.' logo_url: type: string examples: - /storage/logos/organizations/LREuwBDCi9PVWwBEWq51HyvWGY2EpxnhjPCtkxMn.jpg website: type: string examples: - 'https://www.caritas.at' address: type: string examples: - 'Albrechtskreithgasse 19-21' address_line2: type: - string - 'null' examples: - null postal_code: type: - string - 'null' examples: - null city: type: string examples: - Vienna country: type: string examples: - Austria status: type: string examples: - active verified_at: type: string examples: - '2026-08-05T16:18:17.000000Z' is_verified: type: boolean examples: - true total_raised: type: - string - 'null' examples: - null created_at: type: string examples: - '2026-08-05T16:18:17.000000Z' platform_fee_flat_cents: type: - string - 'null' examples: - null firmenbuchnummer: type: - string - 'null' examples: - null uid_number: type: - string - 'null' examples: - null uid_validation_status: type: - string - 'null' examples: - null payout_method: type: - string - 'null' examples: - null stripe_connect_account_id: type: - string - 'null' examples: - null connect_charges_enabled: type: - string - 'null' examples: - null connect_payouts_enabled: type: - string - 'null' examples: - null connect_details_submitted: type: - string - 'null' examples: - null connect_requirements_due: type: - string - 'null' examples: - null connect_country_code: type: - string - 'null' examples: - null errors: type: - string - 'null' examples: - null meta: type: object properties: request_id: type: string examples: - f13486bc-77c2-4f13-8a66-6f45b8c5609f timestamp: type: string examples: - '2026-08-05T16:18:37.762427Z' examples: - status: SUCCESS message: 'Logo uploaded successfully.' data: id: 019fd2b7-f072-7154-8961-5b324cc6c46c name: Caritas slug: caritas-4v1ues email: caritas-portal@flexxr.eu.cc country_code: '+43' phone_number: '6641234567' contact_person_name: null contact_person_phone: null iso_country_code: AT phone_e164: '+436641234567' description: 'Caritas test organisation used for end-to-end portal QA. Safe to delete.' logo_url: /storage/logos/organizations/LREuwBDCi9PVWwBEWq51HyvWGY2EpxnhjPCtkxMn.jpg website: 'https://www.caritas.at' address: 'Albrechtskreithgasse 19-21' address_line2: null postal_code: null city: Vienna country: Austria status: active verified_at: '2026-08-05T16:18:17.000000Z' is_verified: true total_raised: null created_at: '2026-08-05T16:18:17.000000Z' platform_fee_flat_cents: null firmenbuchnummer: null uid_number: null uid_validation_status: null payout_method: null stripe_connect_account_id: null connect_charges_enabled: null connect_payouts_enabled: null connect_details_submitted: null connect_requirements_due: null connect_country_code: null errors: null meta: request_id: f13486bc-77c2-4f13-8a66-6f45b8c5609f timestamp: '2026-08-05T16:18:37.762427Z' 422: description: 'Validation Error' content: application/json: schema: type: object properties: status: type: string examples: - VALIDATION_ERROR message: type: string examples: - 'Validation failed.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: string examples: - logo message: type: string examples: - 'Logo file is required and must be an image.' examples: - - field: logo message: 'Logo file is required and must be an image.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: VALIDATION_ERROR message: 'Validation failed.' data: null errors: - field: logo message: 'Logo file is required and must be an image.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' tags: - 'Organization API' requestBody: required: true content: multipart/form-data: schema: type: object properties: logo: type: string format: binary description: 'Organization logo image file (max 2MB). Must be a valid image file.' required: - logo delete: summary: 'Delete Org Logo' operationId: deleteOrgLogo description: "Removes the authenticated organisation's logo from storage and clears the logo_url field." parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS message: type: string examples: - 'Logo deleted successfully.' data: type: - string - 'null' examples: - null errors: type: - string - 'null' examples: - null meta: type: object properties: request_id: type: string examples: - 6be9ac36-baba-4a55-aff3-f87b0f8d5c17 timestamp: type: string examples: - '2026-08-05T16:18:37.773548Z' examples: - status: SUCCESS message: 'Logo deleted successfully.' data: null errors: null meta: request_id: 6be9ac36-baba-4a55-aff3-f87b0f8d5c17 timestamp: '2026-08-05T16:18:37.773548Z' tags: - 'Organization API' /api/v1/org/me/gdpr-requests: get: summary: 'Lists GDPR Art. 12(3) requests submitted by the authenticated organisation.' operationId: listsGDPRArt123RequestsSubmittedByTheAuthenticatedOrganisation description: '' parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS message: type: string examples: - Success data: type: array examples: - [] errors: type: - string - 'null' examples: - null meta: type: object properties: request_id: type: string examples: - c161e586-954d-48ca-928d-41bad21a8adf timestamp: type: string examples: - '2026-08-05T16:18:38.479808Z' current_page: type: integer examples: - 1 last_page: type: integer examples: - 1 per_page: type: integer examples: - 15 total: type: integer examples: - 0 examples: - status: SUCCESS message: Success data: [] errors: null meta: request_id: c161e586-954d-48ca-928d-41bad21a8adf timestamp: '2026-08-05T16:18:38.479808Z' current_page: 1 last_page: 1 per_page: 15 total: 0 tags: - 'Organization API' post: summary: "Records a new GDPR Art. 12(3) request forwarded by an organisation on\nbehalf of a data subject. Persists the request, emits an audit event,\nand notifies all super-admins via in-app and email." operationId: recordsANewGDPRArt123RequestForwardedByAnOrganisationOnBehalfOfADataSubjectPersistsTheRequestEmitsAnAuditEventAndNotifiesAllSuperAdminsViaInAppAndEmail description: '' parameters: [] responses: 201: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - CREATED message: type: string examples: - 'GDPR request submitted successfully.' data: type: object properties: id: type: string examples: - 019fd2b8-4116-7347-914a-230153f403ce request_type: type: string examples: - access request_type_label: type: string examples: - 'Access (Art. 15)' subject_email: type: string examples: - name@example.at message: type: string examples: - 'Bitte um Rueckmeldung zur naechsten Schicht.' status: type: string examples: - pending status_label: type: string examples: - Pending submitted_at: type: string examples: - '2026-08-05T16:18:38.000000Z' resolved_at: type: - string - 'null' examples: - null platform_note: type: - string - 'null' examples: - null created_at: type: string examples: - '2026-08-05T16:18:38.000000Z' errors: type: - string - 'null' examples: - null meta: type: object properties: request_id: type: string examples: - 8f34c05d-27c1-4a19-b728-9442355514a1 timestamp: type: string examples: - '2026-08-05T16:18:38.490505Z' examples: - status: CREATED message: 'GDPR request submitted successfully.' data: id: 019fd2b8-4116-7347-914a-230153f403ce request_type: access request_type_label: 'Access (Art. 15)' subject_email: name@example.at message: 'Bitte um Rueckmeldung zur naechsten Schicht.' status: pending status_label: Pending submitted_at: '2026-08-05T16:18:38.000000Z' resolved_at: null platform_note: null created_at: '2026-08-05T16:18:38.000000Z' errors: null meta: request_id: 8f34c05d-27c1-4a19-b728-9442355514a1 timestamp: '2026-08-05T16:18:38.490505Z' tags: - 'Organization API' requestBody: required: true content: application/json: schema: type: object properties: subject_email: type: string description: '' examples: - name@example.at request_type: type: string description: 'Allowed: access, erasure, restriction, rectification.' examples: - access message: type: - string - 'null' description: '' examples: - 'Bitte um Rueckmeldung zur naechsten Schicht.' required: - subject_email - request_type /api/v1/org/me/data-export: get: summary: 'GDPR Art. 15 (Right of Access) / Art. 20 (Right to Data Portability).' operationId: gDPRArt15RightOfAccessArt20RightToDataPortability description: "Returns a structured JSON export of the organisation's platform data:\ncampaigns (with images), donations received, recurring donations, and\nteam members. Donor PII is masked — only display names and masked\nemail addresses are included.\n\nAustrian DSG §1(1) + GDPR Art. 12(3): response within one month,\ndelivered immediately here as structured JSON." parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS message: type: string examples: - 'Data export generated.' data: type: object properties: organisation: type: object properties: id: type: string examples: - 019fd2b7-f072-7154-8961-5b324cc6c46c name: type: string examples: - Caritas legal_name: type: - string - 'null' examples: - null legal_form: type: - string - 'null' examples: - null tax_id: type: - string - 'null' examples: - null email: type: string examples: - caritas-portal@flexxr.eu.cc phone: type: string examples: - '+436641234567' website: type: string examples: - 'https://www.caritas.at' country: type: string examples: - Austria city: type: string examples: - Vienna address: type: string examples: - 'Albrechtskreithgasse 19-21' postal_code: type: - string - 'null' examples: - null created_at: type: string examples: - '2026-08-05T16:18:17+00:00' team_members: type: array items: type: object properties: id: type: string examples: - 019fd2b8-285e-707c-865a-ffbe4b08f730 role: type: string examples: - admin is_active: type: boolean examples: - true joined_at: type: string examples: - '2026-08-05T16:18:32+00:00' examples: - - id: 019fd2b8-285e-707c-865a-ffbe4b08f730 role: admin is_active: true joined_at: '2026-08-05T16:18:32+00:00' exported_at: type: string examples: - '2026-08-05T16:18:38+00:00' errors: type: - string - 'null' examples: - null meta: type: object properties: request_id: type: string examples: - c29cdf34-d349-42b5-9f9b-af7de00d12c4 timestamp: type: string examples: - '2026-08-05T16:18:38.498181Z' examples: - status: SUCCESS message: 'Data export generated.' data: organisation: id: 019fd2b7-f072-7154-8961-5b324cc6c46c name: Caritas legal_name: null legal_form: null tax_id: null email: caritas-portal@flexxr.eu.cc phone: '+436641234567' website: 'https://www.caritas.at' country: Austria city: Vienna address: 'Albrechtskreithgasse 19-21' postal_code: null created_at: '2026-08-05T16:18:17+00:00' team_members: - id: 019fd2b8-285e-707c-865a-ffbe4b08f730 role: admin is_active: true joined_at: '2026-08-05T16:18:32+00:00' exported_at: '2026-08-05T16:18:38+00:00' errors: null meta: request_id: c29cdf34-d349-42b5-9f9b-af7de00d12c4 timestamp: '2026-08-05T16:18:38.498181Z' tags: - 'Organization API' /api/v1/org/gdpr/requests: get: summary: 'Lists GDPR Art. 12(3) requests submitted by the authenticated organisation.' operationId: listsGDPRArt123RequestsSubmittedByTheAuthenticatedOrganisation description: '' parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS message: type: string examples: - Success data: type: array examples: - [] errors: type: - string - 'null' examples: - null meta: type: object properties: request_id: type: string examples: - c161e586-954d-48ca-928d-41bad21a8adf timestamp: type: string examples: - '2026-08-05T16:18:38.479808Z' current_page: type: integer examples: - 1 last_page: type: integer examples: - 1 per_page: type: integer examples: - 15 total: type: integer examples: - 0 examples: - status: SUCCESS message: Success data: [] errors: null meta: request_id: c161e586-954d-48ca-928d-41bad21a8adf timestamp: '2026-08-05T16:18:38.479808Z' current_page: 1 last_page: 1 per_page: 15 total: 0 tags: - 'Organization API' post: summary: "Records a new GDPR Art. 12(3) request forwarded by an organisation on\nbehalf of a data subject. Persists the request, emits an audit event,\nand notifies all super-admins via in-app and email." operationId: recordsANewGDPRArt123RequestForwardedByAnOrganisationOnBehalfOfADataSubjectPersistsTheRequestEmitsAnAuditEventAndNotifiesAllSuperAdminsViaInAppAndEmail description: '' parameters: [] responses: 201: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - CREATED message: type: string examples: - 'GDPR request submitted successfully.' data: type: object properties: id: type: string examples: - 019fd2b8-4116-7347-914a-230153f403ce request_type: type: string examples: - access request_type_label: type: string examples: - 'Access (Art. 15)' subject_email: type: string examples: - name@example.at message: type: string examples: - 'Bitte um Rueckmeldung zur naechsten Schicht.' status: type: string examples: - pending status_label: type: string examples: - Pending submitted_at: type: string examples: - '2026-08-05T16:18:38.000000Z' resolved_at: type: - string - 'null' examples: - null platform_note: type: - string - 'null' examples: - null created_at: type: string examples: - '2026-08-05T16:18:38.000000Z' errors: type: - string - 'null' examples: - null meta: type: object properties: request_id: type: string examples: - 8f34c05d-27c1-4a19-b728-9442355514a1 timestamp: type: string examples: - '2026-08-05T16:18:38.490505Z' examples: - status: CREATED message: 'GDPR request submitted successfully.' data: id: 019fd2b8-4116-7347-914a-230153f403ce request_type: access request_type_label: 'Access (Art. 15)' subject_email: name@example.at message: 'Bitte um Rueckmeldung zur naechsten Schicht.' status: pending status_label: Pending submitted_at: '2026-08-05T16:18:38.000000Z' resolved_at: null platform_note: null created_at: '2026-08-05T16:18:38.000000Z' errors: null meta: request_id: 8f34c05d-27c1-4a19-b728-9442355514a1 timestamp: '2026-08-05T16:18:38.490505Z' tags: - 'Organization API' requestBody: required: true content: application/json: schema: type: object properties: subject_email: type: string description: '' examples: - name@example.at request_type: type: string description: 'Allowed: access, erasure, restriction, rectification.' examples: - access message: type: - string - 'null' description: '' examples: - 'Bitte um Rueckmeldung zur naechsten Schicht.' required: - subject_email - request_type /api/v1/org/me/consent-history: get: summary: 'Consent History' operationId: consentHistory description: "Returns a paginated list of cookie-consent decisions recorded for the authenticated organisation.\nBacked by the immutable audit log (GDPR Art. 15 right of access)." parameters: - in: query name: per_page description: 'nullable Results per page (min 1, max 100, default 25).' required: false schema: type: integer description: 'nullable Results per page (min 1, max 100, default 25).' examples: - 25 responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS message: type: string examples: - Success data: type: array examples: - [] errors: type: - string - 'null' examples: - null meta: type: object properties: request_id: type: string examples: - a726ed83-b8fd-4332-9cfe-5ef5302a22f0 timestamp: type: string examples: - '2026-08-05T16:18:38.519100Z' total: type: integer examples: - 0 current_page: type: integer examples: - 1 last_page: type: integer examples: - 1 per_page: type: integer examples: - 25 examples: - status: SUCCESS message: Success data: [] errors: null meta: request_id: a726ed83-b8fd-4332-9cfe-5ef5302a22f0 timestamp: '2026-08-05T16:18:38.519100Z' total: 0 current_page: 1 last_page: 1 per_page: 25 tags: - 'Organization API' /api/v1/org/me/consent: post: summary: 'Record Cookie Consent' operationId: recordCookieConsent description: '' parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS message: type: string examples: - 'Consent recorded.' data: type: object properties: recorded_at: type: string examples: - '2026-08-05T16:18:38+00:00' errors: type: - string - 'null' examples: - null meta: type: object properties: request_id: type: string examples: - 5a2c4cdb-a5b7-4ed0-adc0-6d872d01255a timestamp: type: string examples: - '2026-08-05T16:18:38.527726Z' examples: - status: SUCCESS message: 'Consent recorded.' data: recorded_at: '2026-08-05T16:18:38+00:00' errors: null meta: request_id: 5a2c4cdb-a5b7-4ed0-adc0-6d872d01255a timestamp: '2026-08-05T16:18:38.527726Z' 422: description: 'Validation Error' content: application/json: schema: type: object properties: status: type: string examples: - VALIDATION_ERROR message: type: string examples: - 'The given data was invalid.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: string examples: - choices.necessary message: type: string examples: - 'The choices.necessary field must be accepted.' examples: - - field: choices.necessary message: 'The choices.necessary field must be accepted.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-21T10:00:00.000000Z' examples: - status: VALIDATION_ERROR message: 'The given data was invalid.' data: null errors: - field: choices.necessary message: 'The choices.necessary field must be accepted.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-21T10:00:00.000000Z' tags: - 'Organization API' requestBody: required: true content: application/json: schema: type: object properties: version: type: string description: 'Consent banner version.' examples: - '2026-04-01' choices: type: object description: 'Granular consent flags.' properties: necessary: type: boolean description: 'Always true.' examples: - true analytics: type: boolean description: '' examples: - false marketing: type: boolean description: '' examples: - false required: - necessary - analytics - marketing examples: - [] timestamp: type: string description: 'ISO-8601 client timestamp.' examples: - '2026-04-21T10:00:00.000Z' required: - version - choices - timestamp /api/v1/org/audit-log: get: summary: 'List Org Audit Log' operationId: listOrgAuditLog description: "A paginated view of everything the authenticated organisation did, had\ndone to it, or had done on its behalf. A row is in scope when any of the\nfollowing holds:\n\n a) the organisation is the actor;\n b) the organisation is the subject;\n c) the subject is one of its members; or\n d) one of its members is the actor — most of a company's work is done\n by the people it invited, so without this the log showed almost\n none of the company's real activity.\n\nThe event filter accepts a value from the allowed list, which excludes\nadmin-internal and user-PII events so they are never exposed here." parameters: - in: query name: event description: 'nullable Filter by audit event value (must be in the allowed list).' required: false schema: type: string description: 'nullable Filter by audit event value (must be in the allowed list).' examples: - model.updated - in: query name: from description: 'nullable Inclusive ISO date.' required: false schema: type: string description: 'nullable Inclusive ISO date.' examples: - '2026-01-01' - in: query name: to description: 'nullable Inclusive ISO date.' required: false schema: type: string description: 'nullable Inclusive ISO date.' examples: - '2026-12-31' - in: query name: page description: 'Page number.' required: false schema: type: integer description: 'Page number.' examples: - 1 - in: query name: per_page description: 'Rows per page (1–100, default 25).' required: false schema: type: integer description: 'Rows per page (1–100, default 25).' examples: - 25 responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS message: type: string examples: - 'Audit log retrieved.' data: type: array examples: - [] errors: type: - string - 'null' examples: - null meta: type: object properties: request_id: type: string examples: - 24a91099-8b31-42b2-ae2c-6bcd6450f1fd timestamp: type: string examples: - '2026-08-05T16:18:38.535487Z' current_page: type: integer examples: - 22 last_page: type: integer examples: - 1 per_page: type: integer examples: - 67 total: type: integer examples: - 0 examples: - status: SUCCESS message: 'Audit log retrieved.' data: [] errors: null meta: request_id: 24a91099-8b31-42b2-ae2c-6bcd6450f1fd timestamp: '2026-08-05T16:18:38.535487Z' current_page: 22 last_page: 1 per_page: 67 total: 0 tags: - 'Organization API' requestBody: required: false content: application/json: schema: type: object properties: event: type: - string - 'null' description: '' examples: - architecto from: type: - string - 'null' description: 'Must be a valid date.' examples: - '2026-08-21T05:14:34' to: type: - string - 'null' description: 'Must be a valid date. Must be a date after or equal tofrom.'
examples:
- '2052-09-13'
page:
type:
- integer
- 'null'
description: 'Must be at least 1.'
examples:
- 22
per_page:
type:
- integer
- 'null'
description: 'Must be at least 1.'
examples:
- 67
/api/v1/org/auth/two-factor/enable:
post:
summary: 'Enable Two Factor'
operationId: enableTwoFactor
description: 'Initiates the 2FA setup flow for the authenticated user.'
parameters: []
responses:
200:
description: ''
content:
application/json:
schema:
oneOf:
-
description: Email
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Two-factor authentication initiated.'
data:
type: object
properties:
method:
type: string
examples:
- email
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-04-02T12:00:00.000000Z'
examples:
-
status: SUCCESS
message: 'Two-factor authentication initiated.'
data:
method: email
errors: null
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-04-02T12:00:00.000000Z'
-
description: 'Recorded from a live call'
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Scan the QR code with your authenticator app, then confirm with the generated code.'
data:
type: object
properties:
method:
type: string
examples:
- totp
secret:
type: string
examples:
- 6RL4HDCP2F4CDU27SRQOWOS454GFGIL6
qr_uri:
type: string
examples:
- 'otpauth://totp/Flexxer%20Backend:019fd2b8-b36f-7307-92fb-5d28e58ef9f2?secret=6RL4HDCP2F4CDU27SRQOWOS454GFGIL6&issuer=Flexxer%20Backend&algorithm=SHA1&digits=6&period=30'
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- e9e9b449-d901-409b-a9b4-fd071002aa0e
timestamp:
type: string
examples:
- '2026-08-05T16:19:07.791377Z'
examples:
-
status: SUCCESS
message: 'Scan the QR code with your authenticator app, then confirm with the generated code.'
data:
method: totp
secret: 6RL4HDCP2F4CDU27SRQOWOS454GFGIL6
qr_uri: 'otpauth://totp/Flexxer%20Backend:019fd2b8-b36f-7307-92fb-5d28e58ef9f2?secret=6RL4HDCP2F4CDU27SRQOWOS454GFGIL6&issuer=Flexxer%20Backend&algorithm=SHA1&digits=6&period=30'
errors: null
meta:
request_id: e9e9b449-d901-409b-a9b4-fd071002aa0e
timestamp: '2026-08-05T16:19:07.791377Z'
401:
description: Unauthenticated
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- UNAUTHORIZED
message:
type: string
examples:
- Unauthenticated.
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type:
- string
- 'null'
examples:
- null
message:
type: string
examples:
- Unauthenticated.
examples:
-
-
field: null
message: Unauthenticated.
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-04-02T12:00:00.000000Z'
examples:
-
status: UNAUTHORIZED
message: Unauthenticated.
data: null
errors:
-
field: null
message: Unauthenticated.
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-04-02T12:00:00.000000Z'
422:
description: 'Validation Error'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- VALIDATION_ERROR
message:
type: string
examples:
- 'The given data was invalid.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type: string
examples:
- method
message:
type: string
examples:
- 'The selected method is invalid.'
examples:
-
-
field: method
message: 'The selected method is invalid.'
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-04-02T12:00:00.000000Z'
examples:
-
status: VALIDATION_ERROR
message: 'The given data was invalid.'
data: null
errors:
-
field: method
message: 'The selected method is invalid.'
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-04-02T12:00:00.000000Z'
429:
description: 'Rate Limited'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- RATE_LIMITED
message:
type: string
examples:
- 'Too many requests.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type:
- string
- 'null'
examples:
- null
message:
type: string
examples:
- 'Too many requests.'
examples:
-
-
field: null
message: 'Too many requests.'
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-04-21T19:00:00.000000Z'
examples:
-
status: RATE_LIMITED
message: 'Too many requests.'
data: null
errors:
-
field: null
message: 'Too many requests.'
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-04-21T19:00:00.000000Z'
tags:
- 'Organization API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
method:
type: string
description: 'The 2FA method to enable.'
enum:
- email
- 'totp. Allowed: email'
- totp
examples:
- totp
required:
- method
/api/v1/org/auth/two-factor/confirm:
post:
summary: 'Confirm Two Factor'
operationId: confirmTwoFactor
description: 'Confirms and activates 2FA after the user has verified their code.'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Two-factor authentication has been enabled. Save your recovery codes in a safe place.'
data:
type: object
properties:
recovery_codes:
type: array
items:
type: string
examples:
-
- DTPLO-U2SCF
- MRWS1-IKBUY
- MVM4F-Z42ES
- AUSXU-FTDPK
- U7WHX-TIU99
- 12AWU-NZVH6
- ZY5XK-4WOKJ
- 47MAL-ZSDLU
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 315aafcb-764e-4f38-9faa-b9c4f45e3461
timestamp:
type: string
examples:
- '2026-08-05T16:19:07.807225Z'
examples:
-
status: SUCCESS
message: 'Two-factor authentication has been enabled. Save your recovery codes in a safe place.'
data:
recovery_codes:
- DTPLO-U2SCF
- MRWS1-IKBUY
- MVM4F-Z42ES
- AUSXU-FTDPK
- U7WHX-TIU99
- 12AWU-NZVH6
- ZY5XK-4WOKJ
- 47MAL-ZSDLU
errors: null
meta:
request_id: 315aafcb-764e-4f38-9faa-b9c4f45e3461
timestamp: '2026-08-05T16:19:07.807225Z'
401:
description: ''
content:
application/json:
schema:
oneOf:
-
description: 'Invalid Code'
type: object
properties:
status:
type: string
examples:
- TWO_FACTOR_CODE_INVALID
message:
type: string
examples:
- 'The provided code is invalid or has expired.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type: string
examples:
- code
message:
type: string
examples:
- 'The provided code is invalid or has expired.'
examples:
-
-
field: code
message: 'The provided code is invalid or has expired.'
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-04-02T12:00:00.000000Z'
examples:
-
status: TWO_FACTOR_CODE_INVALID
message: 'The provided code is invalid or has expired.'
data: null
errors:
-
field: code
message: 'The provided code is invalid or has expired.'
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-04-02T12:00:00.000000Z'
-
description: Unauthenticated
type: object
properties:
status:
type: string
examples:
- UNAUTHORIZED
message:
type: string
examples:
- Unauthenticated.
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type:
- string
- 'null'
examples:
- null
message:
type: string
examples:
- Unauthenticated.
examples:
-
-
field: null
message: Unauthenticated.
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-04-02T12:00:00.000000Z'
examples:
-
status: UNAUTHORIZED
message: Unauthenticated.
data: null
errors:
-
field: null
message: Unauthenticated.
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-04-02T12:00:00.000000Z'
409:
description: 'No Pending Setup'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- TWO_FACTOR_NO_PENDING_SETUP
message:
type: string
examples:
- 'No pending two-factor setup found. Please restart the setup process.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type:
- string
- 'null'
examples:
- null
message:
type: string
examples:
- 'No pending two-factor setup found. Please restart the setup process.'
examples:
-
-
field: null
message: 'No pending two-factor setup found. Please restart the setup process.'
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-04-02T12:00:00.000000Z'
examples:
-
status: TWO_FACTOR_NO_PENDING_SETUP
message: 'No pending two-factor setup found. Please restart the setup process.'
data: null
errors:
-
field: null
message: 'No pending two-factor setup found. Please restart the setup process.'
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-04-02T12:00:00.000000Z'
422:
description: 'Validation Error'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- VALIDATION_ERROR
message:
type: string
examples:
- 'The given data was invalid.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type: string
examples:
- code
message:
type: string
examples:
- 'The code field is required.'
examples:
-
-
field: code
message: 'The code field is required.'
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-04-02T12:00:00.000000Z'
examples:
-
status: VALIDATION_ERROR
message: 'The given data was invalid.'
data: null
errors:
-
field: code
message: 'The code field is required.'
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-04-02T12:00:00.000000Z'
429:
description: 'Rate Limited'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- RATE_LIMITED
message:
type: string
examples:
- 'Too many requests.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type:
- string
- 'null'
examples:
- null
message:
type: string
examples:
- 'Too many requests.'
examples:
-
-
field: null
message: 'Too many requests.'
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-04-21T19:00:00.000000Z'
examples:
-
status: RATE_LIMITED
message: 'Too many requests.'
data: null
errors:
-
field: null
message: 'Too many requests.'
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-04-21T19:00:00.000000Z'
tags:
- 'Organization API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
code:
type: string
description: 'The OTP or TOTP code to verify.'
examples:
- '123456'
required:
- code
/api/v1/org/auth/two-factor/disable-code:
post:
summary: 'Request Disable Two Factor Code'
operationId: requestDisableTwoFactorCode
description: "Dispatches a 6-digit OTP to the user's account email so they can\nconfirm a 2FA-disable request. No-op for TOTP accounts (the code\ncomes from the authenticator app directly) and for accounts without\nan enabled 2FA setting — both return 200 so the client's happy path\nis uniform."
parameters: []
responses:
200:
description: ''
content:
application/json:
schema:
oneOf:
-
description: 'TOTP — use authenticator'
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Enter the current code from your authenticator app.'
data:
type: object
properties:
method:
type: string
examples:
- totp
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-04-22T12:00:00.000000Z'
examples:
-
status: SUCCESS
message: 'Enter the current code from your authenticator app.'
data:
method: totp
errors: null
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-04-22T12:00:00.000000Z'
-
description: 'Recorded from a live call'
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Enter the current code from your authenticator app.'
data:
type: object
properties:
method:
type: string
examples:
- totp
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 0542b19f-0c0a-4bf3-93a4-d90bbac46f63
timestamp:
type: string
examples:
- '2026-08-05T16:18:37.138042Z'
examples:
-
status: SUCCESS
message: 'Enter the current code from your authenticator app.'
data:
method: totp
errors: null
meta:
request_id: 0542b19f-0c0a-4bf3-93a4-d90bbac46f63
timestamp: '2026-08-05T16:18:37.138042Z'
409:
description: 'Not Enabled'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- TWO_FACTOR_NOT_ENABLED
message:
type: string
examples:
- 'Two-factor authentication is not currently enabled.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type:
- string
- 'null'
examples:
- null
message:
type: string
examples:
- 'Two-factor authentication is not currently enabled.'
examples:
-
-
field: null
message: 'Two-factor authentication is not currently enabled.'
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-04-22T12:00:00.000000Z'
examples:
-
status: TWO_FACTOR_NOT_ENABLED
message: 'Two-factor authentication is not currently enabled.'
data: null
errors:
-
field: null
message: 'Two-factor authentication is not currently enabled.'
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-04-22T12:00:00.000000Z'
tags:
- 'Organization API'
/api/v1/org/auth/two-factor/disable:
delete:
summary: 'Disable Two Factor'
operationId: disableTwoFactor
description: "Disables 2FA for the authenticated user after verifying a current\nchallenge code — the same proof the user provides at login time."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Two-factor authentication has been disabled.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 255f0d6e-8c58-4e47-84a4-c47dd821febf
timestamp:
type: string
examples:
- '2026-08-05T16:19:07.817111Z'
examples:
-
status: SUCCESS
message: 'Two-factor authentication has been disabled.'
data: null
errors: null
meta:
request_id: 255f0d6e-8c58-4e47-84a4-c47dd821febf
timestamp: '2026-08-05T16:19:07.817111Z'
401:
description: 'Invalid Code'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- TWO_FACTOR_CODE_INVALID
message:
type: string
examples:
- 'The provided code is invalid or has expired.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type: string
examples:
- code
message:
type: string
examples:
- 'The provided code is invalid or has expired.'
examples:
-
-
field: code
message: 'The provided code is invalid or has expired.'
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-04-22T12:00:00.000000Z'
examples:
-
status: TWO_FACTOR_CODE_INVALID
message: 'The provided code is invalid or has expired.'
data: null
errors:
-
field: code
message: 'The provided code is invalid or has expired.'
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-04-22T12:00:00.000000Z'
409:
description: 'Not Enabled'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- TWO_FACTOR_NOT_ENABLED
message:
type: string
examples:
- 'Two-factor authentication is not currently enabled.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type:
- string
- 'null'
examples:
- null
message:
type: string
examples:
- 'Two-factor authentication is not currently enabled.'
examples:
-
-
field: null
message: 'Two-factor authentication is not currently enabled.'
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-04-22T12:00:00.000000Z'
examples:
-
status: TWO_FACTOR_NOT_ENABLED
message: 'Two-factor authentication is not currently enabled.'
data: null
errors:
-
field: null
message: 'Two-factor authentication is not currently enabled.'
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-04-22T12:00:00.000000Z'
422:
description: 'Validation Error'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- VALIDATION_ERROR
message:
type: string
examples:
- 'The given data was invalid.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type: string
examples:
- code
message:
type: string
examples:
- 'Either code or recovery_code is required.'
examples:
-
-
field: code
message: 'Either code or recovery_code is required.'
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-04-22T12:00:00.000000Z'
examples:
-
status: VALIDATION_ERROR
message: 'The given data was invalid.'
data: null
errors:
-
field: code
message: 'Either code or recovery_code is required.'
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-04-22T12:00:00.000000Z'
tags:
- 'Organization API'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
code:
type:
- string
- 'null'
description: '6-digit TOTP or email OTP. Required unless `recovery_code` is provided.'
examples:
- '123456'
recovery_code:
type:
- string
- 'null'
description: 'Recovery code in place of `code`.'
examples:
- ABCD-1234-EFGH
/api/v1/org/security/two-factor:
get:
summary: 'Get Two-Factor State'
operationId: getTwoFactorState
description: ''
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- Success
data:
type: object
properties:
enabled:
type: boolean
examples:
- true
method:
type: string
examples:
- totp
confirmed_at:
type: string
examples:
- '2026-08-05T16:18:32+00:00'
recovery_codes_remaining:
type: integer
examples:
- 2
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 3f0ace2f-07fd-4e6e-9bd0-24b9619f2e8e
timestamp:
type: string
examples:
- '2026-08-05T16:18:38.604346Z'
examples:
-
status: SUCCESS
message: Success
data:
enabled: true
method: totp
confirmed_at: '2026-08-05T16:18:32+00:00'
recovery_codes_remaining: 2
errors: null
meta:
request_id: 3f0ace2f-07fd-4e6e-9bd0-24b9619f2e8e
timestamp: '2026-08-05T16:18:38.604346Z'
tags:
- 'Organization API'
/api/v1/org/security/login-history:
get:
summary: 'List Login History'
operationId: listLoginHistory
description: ''
parameters:
-
in: query
name: limit
description: 'nullable Maximum entries to return (min 1, max 200, default 50).'
required: false
schema:
type: integer
description: 'nullable Maximum entries to return (min 1, max 200, default 50).'
examples:
- 50
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- Success
data:
type: array
examples:
- []
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- a1ef4b94-6775-44ca-996f-3a02b14c2a73
timestamp:
type: string
examples:
- '2026-08-05T16:18:38.610416Z'
examples:
-
status: SUCCESS
message: Success
data: []
errors: null
meta:
request_id: a1ef4b94-6775-44ca-996f-3a02b14c2a73
timestamp: '2026-08-05T16:18:38.610416Z'
tags:
- 'Organization API'
/api/v1/org/sessions:
get:
summary: 'List Sessions'
operationId: listSessions
description: "Lists the authenticated user's (or org's, or admin's) active\nSanctum sessions with their device metadata, sorted by last_used_at\ndescending so the most recently active device is first."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- Success
data:
type: array
items:
type: object
properties:
id:
type: integer
examples:
- 4
name:
type: string
examples:
- docs
device:
type:
- string
- 'null'
examples:
- null
ip_address:
type:
- string
- 'null'
examples:
- null
last_used_at:
type: string
examples:
- '2026-08-05T16:18:37+00:00'
expires_at:
type:
- string
- 'null'
examples:
- null
created_at:
type: string
examples:
- '2026-08-05T16:18:33+00:00'
is_current:
type: boolean
examples:
- true
examples:
-
-
id: 4
name: docs
device: null
ip_address: null
last_used_at: '2026-08-05T16:18:37+00:00'
expires_at: null
created_at: '2026-08-05T16:18:33+00:00'
is_current: true
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- b9c7f080-de76-4ae2-92d4-98f5f9c63e35
timestamp:
type: string
examples:
- '2026-08-05T16:18:37.159008Z'
examples:
-
status: SUCCESS
message: Success
data:
-
id: 4
name: docs
device: null
ip_address: null
last_used_at: '2026-08-05T16:18:37+00:00'
expires_at: null
created_at: '2026-08-05T16:18:33+00:00'
is_current: true
errors: null
meta:
request_id: b9c7f080-de76-4ae2-92d4-98f5f9c63e35
timestamp: '2026-08-05T16:18:37.159008Z'
401:
description: Unauthenticated
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- UNAUTHENTICATED
message:
type: string
examples:
- Unauthenticated.
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type:
- string
- 'null'
examples:
- null
message:
type: string
examples:
- Unauthenticated.
examples:
-
-
field: null
message: Unauthenticated.
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-04-21T19:00:00.000000Z'
examples:
-
status: UNAUTHENTICATED
message: Unauthenticated.
data: null
errors:
-
field: null
message: Unauthenticated.
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-04-21T19:00:00.000000Z'
tags:
- 'Organization API'
delete:
summary: 'Revoke Other Sessions'
operationId: revokeOtherSessions
description: "Logs out every OTHER active session of the authenticated caller,\nkeeping the current one alive (\"Alle anderen Geräte abmelden\")."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- Success
data:
type: object
properties:
revoked:
type: integer
examples:
- 0
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 99342b48-bea9-49b3-a788-41e38c4c0892
timestamp:
type: string
examples:
- '2026-08-05T16:18:37.170260Z'
examples:
-
status: SUCCESS
message: Success
data:
revoked: 0
errors: null
meta:
request_id: 99342b48-bea9-49b3-a788-41e38c4c0892
timestamp: '2026-08-05T16:18:37.170260Z'
401:
description: Unauthenticated
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- UNAUTHENTICATED
message:
type: string
examples:
- Unauthenticated.
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type:
- string
- 'null'
examples:
- null
message:
type: string
examples:
- Unauthenticated.
examples:
-
-
field: null
message: Unauthenticated.
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-06-18T12:00:00.000000Z'
examples:
-
status: UNAUTHENTICATED
message: Unauthenticated.
data: null
errors:
-
field: null
message: Unauthenticated.
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-06-18T12:00:00.000000Z'
tags:
- 'Organization API'
'/api/v1/org/sessions/{tokenId}':
delete:
summary: 'Revoke Session'
operationId: revokeSession
description: 'Revokes a single active session by id.'
parameters: []
responses:
204:
description: Revoked
content:
text/plain:
schema:
type: string
examples:
- ''
401:
description: Unauthenticated
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- UNAUTHENTICATED
message:
type: string
examples:
- Unauthenticated.
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type:
- string
- 'null'
examples:
- null
message:
type: string
examples:
- Unauthenticated.
examples:
-
-
field: null
message: Unauthenticated.
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-04-21T19:00:00.000000Z'
examples:
-
status: UNAUTHENTICATED
message: Unauthenticated.
data: null
errors:
-
field: null
message: Unauthenticated.
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-04-21T19:00:00.000000Z'
404:
description: 'Not Found'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- NOT_FOUND
message:
type: string
examples:
- 'Session not found.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type:
- string
- 'null'
examples:
- null
message:
type: string
examples:
- 'Session not found.'
examples:
-
-
field: null
message: 'Session not found.'
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-04-02T12:00:00.000000Z'
examples:
-
status: NOT_FOUND
message: 'Session not found.'
data: null
errors:
-
field: null
message: 'Session not found.'
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-04-02T12:00:00.000000Z'
429:
description: 'Rate Limited'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- RATE_LIMITED
message:
type: string
examples:
- 'Too many requests.'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type:
- string
- 'null'
examples:
- null
message:
type: string
examples:
- 'Too many requests.'
examples:
-
-
field: null
message: 'Too many requests.'
meta:
type: object
properties:
request_id:
type: string
examples:
- 550e8400-e29b-41d4-a716-446655440000
timestamp:
type: string
examples:
- '2026-04-21T19:00:00.000000Z'
examples:
-
status: RATE_LIMITED
message: 'Too many requests.'
data: null
errors:
-
field: null
message: 'Too many requests.'
meta:
request_id: 550e8400-e29b-41d4-a716-446655440000
timestamp: '2026-04-21T19:00:00.000000Z'
tags:
- 'Organization API'
parameters:
-
in: path
name: tokenId
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
-
in: path
name: sessionId
description: 'The ID of the session to revoke.'
required: true
schema:
type: integer
examples:
- 16
/api/v1/org/kyc-status:
get:
summary: 'Get Organisation KYC Status'
operationId: getOrganisationKYCStatus
description: 'Returns the KYC checklist status for the authenticated organisation.'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'KYC-Status erfolgreich abgerufen.'
data:
type: object
properties:
organization:
type: object
properties:
id:
type: string
examples:
- 019fd2b7-f072-7154-8961-5b324cc6c46c
status:
type: string
examples:
- active
statusLabel:
type: string
examples:
- Active
rejectionReason:
type:
- string
- 'null'
examples:
- null
verifiedAt:
type: string
examples:
- '2026-08-05T16:18:17+00:00'
summary:
type: object
properties:
requiredCount:
type: integer
examples:
- 5
uploadedCount:
type: integer
examples:
- 0
approvedCount:
type: integer
examples:
- 0
rejectedCount:
type: integer
examples:
- 0
missingCount:
type: integer
examples:
- 5
completionPercent:
type: integer
examples:
- 0
isReadyForReview:
type: boolean
examples:
- false
nextAction:
type: string
examples:
- upload_missing
checklist:
type: array
items:
type: object
properties:
type:
type: string
examples:
- gewerbeschein
label:
type: string
examples:
- Gewerbeschein
description:
type:
- string
- 'null'
examples:
- null
required:
type: boolean
examples:
- true
source:
type: string
examples:
- baseline
status:
type: string
examples:
- missing
latestDocument:
type:
- string
- 'null'
examples:
- null
historyCount:
type: integer
examples:
- 0
openRequestId:
type:
- string
- 'null'
examples:
- null
examples:
-
-
type: gewerbeschein
label: Gewerbeschein
description: null
required: true
source: baseline
status: missing
latestDocument: null
historyCount: 0
openRequestId: null
-
type: firmenbuch_auszug
label: Firmenbuchauszug
description: null
required: true
source: baseline
status: missing
latestDocument: null
historyCount: 0
openRequestId: null
-
type: aueg_bewilligung
label: AÜG-Bewilligung
description: null
required: true
source: baseline
status: missing
latestDocument: null
historyCount: 0
openRequestId: null
-
type: ausweis_gf
label: 'Ausweis Geschäftsführer'
description: null
required: true
source: baseline
status: missing
latestDocument: null
historyCount: 0
openRequestId: null
-
type: unterschriftenprobe
label: Unterschriftenprobe
description: null
required: true
source: baseline
status: missing
latestDocument: null
historyCount: 0
openRequestId: null
-
type: uid_bestaetigung
label: UID-Bestätigung
description: null
required: false
source: baseline
status: missing
latestDocument: null
historyCount: 0
openRequestId: null
openRequests:
type: array
examples:
- []
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 673ba49d-0208-4a7a-8bd6-ccba99d10ede
timestamp:
type: string
examples:
- '2026-08-05T16:18:38.651604Z'
examples:
-
status: SUCCESS
message: 'KYC-Status erfolgreich abgerufen.'
data:
organization:
id: 019fd2b7-f072-7154-8961-5b324cc6c46c
status: active
statusLabel: Active
rejectionReason: null
verifiedAt: '2026-08-05T16:18:17+00:00'
summary:
requiredCount: 5
uploadedCount: 0
approvedCount: 0
rejectedCount: 0
missingCount: 5
completionPercent: 0
isReadyForReview: false
nextAction: upload_missing
checklist:
-
type: gewerbeschein
label: Gewerbeschein
description: null
required: true
source: baseline
status: missing
latestDocument: null
historyCount: 0
openRequestId: null
-
type: firmenbuch_auszug
label: Firmenbuchauszug
description: null
required: true
source: baseline
status: missing
latestDocument: null
historyCount: 0
openRequestId: null
-
type: aueg_bewilligung
label: AÜG-Bewilligung
description: null
required: true
source: baseline
status: missing
latestDocument: null
historyCount: 0
openRequestId: null
-
type: ausweis_gf
label: 'Ausweis Geschäftsführer'
description: null
required: true
source: baseline
status: missing
latestDocument: null
historyCount: 0
openRequestId: null
-
type: unterschriftenprobe
label: Unterschriftenprobe
description: null
required: true
source: baseline
status: missing
latestDocument: null
historyCount: 0
openRequestId: null
-
type: uid_bestaetigung
label: UID-Bestätigung
description: null
required: false
source: baseline
status: missing
latestDocument: null
historyCount: 0
openRequestId: null
openRequests: []
errors: null
meta:
request_id: 673ba49d-0208-4a7a-8bd6-ccba99d10ede
timestamp: '2026-08-05T16:18:38.651604Z'
tags:
- 'Organization API'
/api/v1/org/documents:
get:
summary: 'List Organization Documents'
operationId: listOrganizationDocuments
description: 'Lists all non-deleted KYC documents belonging to the authenticated organisation.'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Dokumente erfolgreich abgerufen.'
data:
type: array
examples:
- []
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- f421c038-b8cf-43c0-ab3b-142d37da1232
timestamp:
type: string
examples:
- '2026-08-05T16:18:38.658086Z'
examples:
-
status: SUCCESS
message: 'Dokumente erfolgreich abgerufen.'
data: []
errors: null
meta:
request_id: f421c038-b8cf-43c0-ab3b-142d37da1232
timestamp: '2026-08-05T16:18:38.658086Z'
tags:
- 'Organization API'
post:
summary: 'Upload Organization Document'
operationId: uploadOrganizationDocument
description: 'Accepts a KYC document upload from the authenticated organisation.'
parameters: []
responses: { }
tags:
- 'Organization API'
requestBody:
required: true
content:
multipart/form-data:
schema:
type: object
properties:
type:
type: string
description: ''
examples:
- Beispieltext
file:
type: string
format: binary
description: ''
document_request_id:
type:
- string
- 'null'
description: ''
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
required:
- type
- file
'/api/v1/org/documents/{document_id}/download':
get:
summary: 'Download Organization Document'
operationId: downloadOrganizationDocument
description: 'Streams a KYC document back to the owning organisation.'
parameters: []
responses:
503:
description: ''
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- ERROR
message:
type: string
examples:
- 'Service Unavailable'
data:
type:
- string
- 'null'
examples:
- null
errors:
type: array
items:
type: object
properties:
field:
type:
- string
- 'null'
examples:
- null
message:
type: string
examples:
- 'Service Unavailable'
examples:
-
-
field: null
message: 'Service Unavailable'
meta:
type: object
properties:
request_id:
type: string
examples:
- b21dce97-33bd-4cbb-a28c-67af75128d72
timestamp:
type: string
examples:
- '2026-08-21T05:14:34.591593Z'
examples:
-
status: ERROR
message: 'Service Unavailable'
data: null
errors:
-
field: null
message: 'Service Unavailable'
meta:
request_id: b21dce97-33bd-4cbb-a28c-67af75128d72
timestamp: '2026-08-21T05:14:34.591593Z'
tags:
- 'Organization API'
parameters:
-
in: path
name: document_id
description: 'The ID of the document.'
required: true
schema:
type: string
examples:
- 019f34d3-5029-7158-a549-910ae39abad5
-
in: path
name: document
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
'/api/v1/org/documents/{document_id}':
delete:
summary: 'Delete Organization Document'
operationId: deleteOrganizationDocument
description: 'Soft-deletes a Pending KYC document belonging to the authenticated organisation.'
parameters: []
responses: { }
tags:
- 'Organization API'
parameters:
-
in: path
name: document_id
description: 'The ID of the document.'
required: true
schema:
type: string
examples:
- 019f34d3-5029-7158-a549-910ae39abad5
-
in: path
name: document
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
/api/v1/org/legal-documents:
get:
summary: 'List Organisation Legal Documents'
operationId: listOrganisationLegalDocuments
description: "Lists the legal documents the organisation must accept, the current acceptance\nstate per type, and the full acceptance history (for the \"Legal documents\" page)."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Rechtsdokumente erfolgreich abgerufen.'
data:
type: object
properties:
documents:
type: array
items:
type: object
properties:
type:
type: string
examples:
- privacy_policy
label:
type: string
examples:
- Datenschutzerklärung
locale:
type: string
examples:
- de
currentVersion:
type: integer
examples:
- 1
currentVersionId:
type: string
examples:
- 019fd2b7-ef68-7312-a1a3-6b14820cf9e2
acceptedVersion:
type: integer
examples:
- 1
acceptedAt:
type: string
examples:
- '2026-08-05T16:18:32+00:00'
status:
type: string
examples:
- accepted
viewUrl:
type: string
examples:
- 'http://localhost:8001/legal/privacy_policy/de/v/1'
examples:
-
-
type: privacy_policy
label: Datenschutzerklärung
locale: de
currentVersion: 1
currentVersionId: 019fd2b7-ef68-7312-a1a3-6b14820cf9e2
acceptedVersion: 1
acceptedAt: '2026-08-05T16:18:32+00:00'
status: accepted
viewUrl: 'http://localhost:8001/legal/privacy_policy/de/v/1'
-
type: terms_of_service
label: 'Allgemeine Geschäftsbedingungen'
locale: de
currentVersion: 1
currentVersionId: 019fd2b7-ef6f-72ae-8c86-d9977da26ec0
acceptedVersion: 1
acceptedAt: '2026-08-05T16:18:32+00:00'
status: accepted
viewUrl: 'http://localhost:8001/legal/terms_of_service/de/v/1'
-
type: data_processing
label: Auftragsverarbeitung
locale: de
currentVersion: 1
currentVersionId: 019fd2b7-ef76-73b5-a9c5-d7cca778324b
acceptedVersion: 1
acceptedAt: '2026-08-05T16:18:32+00:00'
status: accepted
viewUrl: 'http://localhost:8001/legal/data_processing/de/v/1'
-
type: svnr_consent
label: 'Einwilligung zur SV-Nummer'
locale: de
currentVersion: 1
currentVersionId: 019fd2b7-ef83-7298-a78c-af4b1e36b67b
acceptedVersion: 1
acceptedAt: '2026-08-05T16:18:32+00:00'
status: accepted
viewUrl: 'http://localhost:8001/legal/svnr_consent/de/v/1'
history:
type: array
items:
type: object
properties:
type:
type: string
examples:
- svnr_consent
label:
type: string
examples:
- 'Einwilligung zur SV-Nummer'
version:
type: integer
examples:
- 1
acceptedAt:
type: string
examples:
- '2026-08-05T16:18:32+00:00'
withdrawnAt:
type:
- string
- 'null'
examples:
- null
examples:
-
-
type: svnr_consent
label: 'Einwilligung zur SV-Nummer'
version: 1
acceptedAt: '2026-08-05T16:18:32+00:00'
withdrawnAt: null
-
type: data_processing
label: Auftragsverarbeitung
version: 1
acceptedAt: '2026-08-05T16:18:32+00:00'
withdrawnAt: null
-
type: terms_of_service
label: 'Allgemeine Geschäftsbedingungen'
version: 1
acceptedAt: '2026-08-05T16:18:32+00:00'
withdrawnAt: null
-
type: privacy_policy
label: Datenschutzerklärung
version: 1
acceptedAt: '2026-08-05T16:18:32+00:00'
withdrawnAt: null
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 5088afd2-6632-4150-9a93-7a8d53e7d090
timestamp:
type: string
examples:
- '2026-08-05T16:18:38.691599Z'
examples:
-
status: SUCCESS
message: 'Rechtsdokumente erfolgreich abgerufen.'
data:
documents:
-
type: privacy_policy
label: Datenschutzerklärung
locale: de
currentVersion: 1
currentVersionId: 019fd2b7-ef68-7312-a1a3-6b14820cf9e2
acceptedVersion: 1
acceptedAt: '2026-08-05T16:18:32+00:00'
status: accepted
viewUrl: 'http://localhost:8001/legal/privacy_policy/de/v/1'
-
type: terms_of_service
label: 'Allgemeine Geschäftsbedingungen'
locale: de
currentVersion: 1
currentVersionId: 019fd2b7-ef6f-72ae-8c86-d9977da26ec0
acceptedVersion: 1
acceptedAt: '2026-08-05T16:18:32+00:00'
status: accepted
viewUrl: 'http://localhost:8001/legal/terms_of_service/de/v/1'
-
type: data_processing
label: Auftragsverarbeitung
locale: de
currentVersion: 1
currentVersionId: 019fd2b7-ef76-73b5-a9c5-d7cca778324b
acceptedVersion: 1
acceptedAt: '2026-08-05T16:18:32+00:00'
status: accepted
viewUrl: 'http://localhost:8001/legal/data_processing/de/v/1'
-
type: svnr_consent
label: 'Einwilligung zur SV-Nummer'
locale: de
currentVersion: 1
currentVersionId: 019fd2b7-ef83-7298-a78c-af4b1e36b67b
acceptedVersion: 1
acceptedAt: '2026-08-05T16:18:32+00:00'
status: accepted
viewUrl: 'http://localhost:8001/legal/svnr_consent/de/v/1'
history:
-
type: svnr_consent
label: 'Einwilligung zur SV-Nummer'
version: 1
acceptedAt: '2026-08-05T16:18:32+00:00'
withdrawnAt: null
-
type: data_processing
label: Auftragsverarbeitung
version: 1
acceptedAt: '2026-08-05T16:18:32+00:00'
withdrawnAt: null
-
type: terms_of_service
label: 'Allgemeine Geschäftsbedingungen'
version: 1
acceptedAt: '2026-08-05T16:18:32+00:00'
withdrawnAt: null
-
type: privacy_policy
label: Datenschutzerklärung
version: 1
acceptedAt: '2026-08-05T16:18:32+00:00'
withdrawnAt: null
errors: null
meta:
request_id: 5088afd2-6632-4150-9a93-7a8d53e7d090
timestamp: '2026-08-05T16:18:38.691599Z'
tags:
- 'Organization API'
/api/v1/org/legal-documents/pending:
get:
summary: 'Get Organisation Pending Legal Acceptances'
operationId: getOrganisationPendingLegalAcceptances
description: 'Returns the legal document versions the organisation must still accept.'
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
message:
type: string
examples:
- 'Ausstehende Rechtsdokumente erfolgreich abgerufen.'
data:
type: object
properties:
pending:
type: array
examples:
- []
errors:
type:
- string
- 'null'
examples:
- null
meta:
type: object
properties:
request_id:
type: string
examples:
- 8b96ae8c-9c5d-435e-a7ab-974f30899fbb
timestamp:
type: string
examples:
- '2026-08-05T16:18:38.707936Z'
examples:
-
status: SUCCESS
message: 'Ausstehende Rechtsdokumente erfolgreich abgerufen.'
data:
pending: []
errors: null
meta:
request_id: 8b96ae8c-9c5d-435e-a7ab-974f30899fbb
timestamp: '2026-08-05T16:18:38.707936Z'
tags:
- 'Organization API'
'/api/v1/org/legal-documents/{type}/accept':
post:
summary: 'Accept Organisation Legal Document'
operationId: acceptOrganisationLegalDocument
description: "Records the organisation's acceptance of the current version of a legal\ndocument type, pinning the exact version for audit."
parameters: []
responses: { }
tags:
- 'Organization API'
parameters:
-
in: path
name: type
description: 'Identifier from the collection.'
required: true
schema:
type: string
examples:
- 019f9939-c4c3-70fb-a54e-5ebf63db36d2
/api/v1/org/contract-template:
get:
summary: 'Get Contract Template'
operationId: getContractTemplate
description: "The organisation's default contract template for the settings editor: the\nsaved organisation-level row when one exists, otherwise the built-in\ndefault body — plus the merge fields the editor can insert. Per-job and\nper-shift overrides have their own endpoints ({@see GetJobContractTemplateAction},\n{@see GetShiftContractTemplateAction}); this is always the organisation\ndefault level (job_id and shift_id both null)."
parameters: []
responses:
200:
description: 'Recorded from a live call'
content:
application/json:
schema:
type: object
properties:
status:
type: string
examples:
- SUCCESS
data:
type: object
properties:
template:
type: object
properties:
name:
type: string
examples:
- Überlassungsvertrag
body_html:
type: string
examples:
- "{worker_name}, geboren am {worker_birth_date}, {worker_address}
\n{organization_name}, {organization_address}
\nTätigkeit: {job_title}
Einsatzort: {location}
Zeitraum: {start_date} – {end_date}
Entgelt (brutto/Std.): {hourly_rate}
Kollektivvertrag: {collective_agreement}
Für die Dauer der Überlassung gelten gemäß § 10 AÜG die im Beschäftigerbetrieb für vergleichbare Arbeitnehmer geltenden wesentlichen Arbeits- und Beschäftigungsbedingungen. Rechtsgrundlage: {legal_basis}.
" version: type: integer examples: - 0 is_active: type: boolean examples: - false is_customized: type: boolean examples: - false merge_fields: type: array items: type: string examples: - - contract_number - worker_name - worker_birth_date - worker_nationality - worker_address - organization_name - organization_address - job_title - job_description - location - start_date - end_date - hourly_rate - collective_agreement - legal_basis examples: - status: SUCCESS data: template: name: Überlassungsvertrag body_html: "{worker_name}, geboren am {worker_birth_date}, {worker_address}
\n{organization_name}, {organization_address}
\nTätigkeit: {job_title}
Einsatzort: {location}
Zeitraum: {start_date} – {end_date}
Entgelt (brutto/Std.): {hourly_rate}
Kollektivvertrag: {collective_agreement}
Für die Dauer der Überlassung gelten gemäß § 10 AÜG die im Beschäftigerbetrieb für vergleichbare Arbeitnehmer geltenden wesentlichen Arbeits- und Beschäftigungsbedingungen. Rechtsgrundlage: {legal_basis}.
" version: 0 is_active: false is_customized: false merge_fields: - contract_number - worker_name - worker_birth_date - worker_nationality - worker_address - organization_name - organization_address - job_title - job_description - location - start_date - end_date - hourly_rate - collective_agreement - legal_basis tags: - 'Organization API' put: summary: 'Update Contract Template' operationId: updateContractTemplate description: "Save the organisation's default contract template (job_id and shift_id both\nnull). Upserts the single per-org row, bumps its version, and strips active\ncontent (script/style) from the HTML — the body is rendered into the\nworker's signed PDF unless a job or shift override applies." parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS message: type: string examples: - 'The contract template has been saved.' data: type: object properties: template: type: object properties: name: type: string examples: - Beispieltext body_html: type: string examples: - 'Bitte um Rueckmeldung zur naechsten Schicht.' version: type: integer examples: - 1 is_active: type: boolean examples: - true is_customized: type: boolean examples: - true examples: - status: SUCCESS message: 'The contract template has been saved.' data: template: name: Beispieltext body_html: 'Bitte um Rueckmeldung zur naechsten Schicht.' version: 1 is_active: true is_customized: true tags: - 'Organization API' requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: '' examples: - Beispieltext body_html: type: string description: '' examples: - 'Bitte um Rueckmeldung zur naechsten Schicht.' is_active: type: boolean description: '' examples: - true required: - body_html /api/v1/org/messages/conversations: get: summary: 'List Conversations' operationId: listConversations description: 'List conversations for organization staff.' parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS data: type: object properties: conversations: type: array items: type: object properties: id: type: string examples: - 64c3f8d8-55d2-4457-b394-c3277a378bac participant: type: object properties: id: type: string examples: - 019fd2b7-f271-73fd-8268-848be381e136 name: type: string examples: - 'Anna Neuling' avatar_url: type: - string - 'null' examples: - null job: type: - string - 'null' examples: - null last_message: type: - string - 'null' examples: - null last_message_is_from_user: type: - string - 'null' examples: - null last_message_at: type: string examples: - '2026-08-05T16:18:32+00:00' unread_count: type: integer examples: - 0 examples: - - id: 64c3f8d8-55d2-4457-b394-c3277a378bac participant: id: 019fd2b7-f271-73fd-8268-848be381e136 name: 'Anna Neuling' avatar_url: null job: null last_message: null last_message_is_from_user: null last_message_at: '2026-08-05T16:18:32+00:00' unread_count: 0 examples: - status: SUCCESS data: conversations: - id: 64c3f8d8-55d2-4457-b394-c3277a378bac participant: id: 019fd2b7-f271-73fd-8268-848be381e136 name: 'Anna Neuling' avatar_url: null job: null last_message: null last_message_is_from_user: null last_message_at: '2026-08-05T16:18:32+00:00' unread_count: 0 tags: - 'Organization API' '/api/v1/org/messages/conversations/{conversation_id}': get: summary: 'Get Messages' operationId: getMessages description: 'Get messages for a conversation.' parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS data: type: object properties: conversation: type: object properties: id: type: string examples: - 64c3f8d8-55d2-4457-b394-c3277a378bac participant: type: object properties: id: type: string examples: - 019fd2b7-f271-73fd-8268-848be381e136 name: type: string examples: - 'Anna Neuling' avatar_url: type: - string - 'null' examples: - null job: type: - string - 'null' examples: - null messages: type: array examples: - [] pagination: type: object properties: current_page: type: integer examples: - 1 last_page: type: integer examples: - 1 per_page: type: integer examples: - 50 total: type: integer examples: - 0 examples: - status: SUCCESS data: conversation: id: 64c3f8d8-55d2-4457-b394-c3277a378bac participant: id: 019fd2b7-f271-73fd-8268-848be381e136 name: 'Anna Neuling' avatar_url: null job: null messages: [] pagination: current_page: 1 last_page: 1 per_page: 50 total: 0 tags: - 'Organization API' parameters: - in: path name: conversation_id description: 'The ID of the conversation.' required: true schema: type: string examples: - 019fd51d-53c7-73d0-880d-8edee1800329 - in: path name: conversation description: 'Identifier from the collection.' required: true schema: type: string examples: - 019f9939-c4c3-70fb-a54e-5ebf63db36d2 '/api/v1/org/messages/conversations/{conversation}/read': post: summary: 'Mark Conversation Read' operationId: markConversationRead description: 'Mark a conversation as read by the organization.' parameters: [] responses: 200: description: 'Marked read' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS examples: - status: SUCCESS tags: - 'Organization API' parameters: - in: path name: conversation description: 'Identifier from the collection.' required: true schema: type: string examples: - 019f9939-c4c3-70fb-a54e-5ebf63db36d2 '/api/v1/org/messages/conversations/{conversation}/attachments': post: summary: 'Upload a Message Attachment' operationId: uploadAMessageAttachment description: "Upload a file attachment ahead of sending it with a message. The\nreturned attachment id is bound to a message when that message is sent." parameters: [] responses: 201: description: Uploaded content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS data: type: object properties: attachment: type: object properties: id: type: string examples: - 019f9939-c4c3-70fb-a54e-5ebf63db36d2 name: type: string examples: - beleg.pdf mime_type: type: string examples: - application/pdf file_size: type: integer examples: - 48213 examples: - status: SUCCESS data: attachment: id: 019f9939-c4c3-70fb-a54e-5ebf63db36d2 name: beleg.pdf mime_type: application/pdf file_size: 48213 tags: - 'Organization API' requestBody: required: true content: multipart/form-data: schema: type: object properties: file: type: string format: binary description: 'The photo or document.' required: - file parameters: - in: path name: conversation description: 'Identifier from the collection.' required: true schema: type: string examples: - 019f9939-c4c3-70fb-a54e-5ebf63db36d2 /api/v1/org/messages: post: summary: 'Send Message' operationId: sendMessage description: 'Send a message to an employee.' parameters: [] responses: 201: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS data: type: object properties: message: type: object properties: id: type: string examples: - 019fd2b8-4623-72c9-81f4-41013427b344 conversation_id: type: string examples: - 019fd2b8-4620-7315-bdd5-20f236d38c04 content: type: string examples: - Beispieltext created_at: type: string examples: - '2026-08-05T16:18:39+00:00' examples: - status: SUCCESS data: message: id: 019fd2b8-4623-72c9-81f4-41013427b344 conversation_id: 019fd2b8-4620-7315-bdd5-20f236d38c04 content: Beispieltext created_at: '2026-08-05T16:18:39+00:00' tags: - 'Organization API' requestBody: required: true content: application/json: schema: type: object properties: user_id: type: string description: '' examples: - 019f9939-c4c3-70fb-a54e-5ebf63db36d2 content: type: - string - 'null' description: 'Required unless attachments are present.' examples: - Beispieltext job_id: type: - string - 'null' description: '' examples: - 019f9939-c4c3-70fb-a54e-5ebf63db36d2 shift_id: type: - string - 'null' description: '' examples: - 019f9939-c4c3-70fb-a54e-5ebf63db36d2 attachments: type: array description: 'IDs from the attachment upload endpoint.' items: type: string examples: - null required: - user_id /api/v1/org/audit-log/pii-reveal: post: summary: 'Record Organisation Pii Reveal' operationId: recordOrganisationPiiReveal description: '' parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS message: type: string examples: - 'PII reveal has been audit logged.' examples: - status: SUCCESS message: 'PII reveal has been audit logged.' tags: - 'Organization API' requestBody: required: true content: application/json: schema: type: object properties: module: type: string description: '' examples: - Beispieltext context: type: string description: '' examples: - Beispieltext subject_type: type: string description: '' examples: - 'Frage zur Abrechnung' subject_id: type: string description: '' examples: - 019f9939-c4c3-70fb-a54e-5ebf63db36d2 fields: type: array description: '' items: type: string examples: - null required: - module /api/v1/org/support/tickets: get: summary: 'List Support Tickets' operationId: listSupportTickets description: 'The tickets visible to the caller, newest first, optionally narrowed by status.' parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS data: type: object properties: tickets: type: array items: type: object properties: id: type: string examples: - 019fd2b8-28b2-7322-b70c-bc7d76debfc3 ticket_number: type: string examples: - TKT-717858 subject: type: string examples: - 'Nihil autem neque blanditiis accusantium eaque.' category: type: string examples: - general category_label: type: string examples: - Allgemein status: type: string examples: - open status_label: type: string examples: - Offen priority: type: integer examples: - 3 requester_type: type: string examples: - company requester_name: type: string examples: - Caritas assignee_name: type: - string - 'null' examples: - null message_count: type: integer examples: - 0 last_message_at: type: - string - 'null' examples: - null created_at: type: string examples: - '2026-08-05T16:18:32+00:00' examples: - - id: 019fd2b8-28b2-7322-b70c-bc7d76debfc3 ticket_number: TKT-717858 subject: 'Nihil autem neque blanditiis accusantium eaque.' category: general category_label: Allgemein status: open status_label: Offen priority: 3 requester_type: company requester_name: Caritas assignee_name: null message_count: 0 last_message_at: null created_at: '2026-08-05T16:18:32+00:00' pagination: type: object properties: current_page: type: integer examples: - 1 last_page: type: integer examples: - 1 per_page: type: integer examples: - 20 total: type: integer examples: - 1 examples: - status: SUCCESS data: tickets: - id: 019fd2b8-28b2-7322-b70c-bc7d76debfc3 ticket_number: TKT-717858 subject: 'Nihil autem neque blanditiis accusantium eaque.' category: general category_label: Allgemein status: open status_label: Offen priority: 3 requester_type: company requester_name: Caritas assignee_name: null message_count: 0 last_message_at: null created_at: '2026-08-05T16:18:32+00:00' pagination: current_page: 1 last_page: 1 per_page: 20 total: 1 tags: - 'Organization API' post: summary: 'Open a Support Ticket' operationId: openASupportTicket description: 'Raises a new support ticket with a subject and an opening message.' parameters: [] responses: { } tags: - 'Organization API' requestBody: required: true content: application/json: schema: type: object properties: category: type: string description: 'Allowed: general, shift, payment, contract, account, technical, complaint, profile_change, document, other.' examples: - general subject: type: string description: '' examples: - 'Frage zur Abrechnung' description: type: string description: '' examples: - Beispieltext related_entity_type: type: string description: 'Allowed: shift, contract, job.' examples: - shift related_entity_id: type: string description: '' examples: - 019f9939-c4c3-70fb-a54e-5ebf63db36d2 required: - category - subject - description '/api/v1/org/support/tickets/{ticketId}': get: summary: 'Show a Support Ticket' operationId: showASupportTicket description: 'One ticket with its message thread. Internal notes are never included.' parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS data: type: object properties: id: type: string examples: - 019fd2b8-28b2-7322-b70c-bc7d76debfc3 ticket_number: type: string examples: - TKT-717858 subject: type: string examples: - 'Nihil autem neque blanditiis accusantium eaque.' category: type: string examples: - general category_label: type: string examples: - Allgemein status: type: string examples: - open status_label: type: string examples: - Offen priority: type: integer examples: - 3 requester_type: type: string examples: - company requester_name: type: string examples: - Caritas assignee_name: type: - string - 'null' examples: - null message_count: type: integer examples: - 0 last_message_at: type: - string - 'null' examples: - null created_at: type: string examples: - '2026-08-05T16:18:32+00:00' description: type: string examples: - "Quo necessitatibus et tempora esse nemo. Omnis et molestias sed expedita cupiditate.\n\nQuidem mollitia et reprehenderit enim quidem est. Temporibus et blanditiis iusto officia neque molestiae quidem. Adipisci suscipit sit temporibus voluptatum porro molestiae omnis. Rem fuga ratione ratione odio esse odio modi." resolution_notes: type: - string - 'null' examples: - null related_entity_type: type: - string - 'null' examples: - null related_entity_id: type: - string - 'null' examples: - null assigned_to: type: - string - 'null' examples: - null first_response_at: type: - string - 'null' examples: - null resolved_at: type: - string - 'null' examples: - null messages: type: array examples: - [] examples: - status: SUCCESS data: id: 019fd2b8-28b2-7322-b70c-bc7d76debfc3 ticket_number: TKT-717858 subject: 'Nihil autem neque blanditiis accusantium eaque.' category: general category_label: Allgemein status: open status_label: Offen priority: 3 requester_type: company requester_name: Caritas assignee_name: null message_count: 0 last_message_at: null created_at: '2026-08-05T16:18:32+00:00' description: "Quo necessitatibus et tempora esse nemo. Omnis et molestias sed expedita cupiditate.\n\nQuidem mollitia et reprehenderit enim quidem est. Temporibus et blanditiis iusto officia neque molestiae quidem. Adipisci suscipit sit temporibus voluptatum porro molestiae omnis. Rem fuga ratione ratione odio esse odio modi." resolution_notes: null related_entity_type: null related_entity_id: null assigned_to: null first_response_at: null resolved_at: null messages: [] tags: - 'Organization API' parameters: - in: path name: ticketId description: 'The ticket.' required: true schema: type: string examples: - 019f9939-c4c3-70fb-a54e-5ebf63db36d2 '/api/v1/org/support/tickets/{ticketId}/messages': post: summary: 'Reply to a Support Ticket' operationId: replyToASupportTicket description: 'Appends a message to an existing ticket.' parameters: [] responses: 201: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS message: type: string examples: - 'Your message has been sent.' data: type: object properties: message: type: object properties: id: type: string examples: - 019fd2b8-46aa-7182-9c38-e64d58e94097 message: type: string examples: - 'Bitte um Rueckmeldung zur naechsten Schicht.' sender_type: type: string examples: - company sender_name: type: string examples: - Caritas is_internal: type: boolean examples: - false attachments: type: - string - 'null' examples: - null created_at: type: string examples: - '2026-08-05T16:18:39+00:00' examples: - status: SUCCESS message: 'Your message has been sent.' data: message: id: 019fd2b8-46aa-7182-9c38-e64d58e94097 message: 'Bitte um Rueckmeldung zur naechsten Schicht.' sender_type: company sender_name: Caritas is_internal: false attachments: null created_at: '2026-08-05T16:18:39+00:00' tags: - 'Organization API' requestBody: required: true content: application/json: schema: type: object properties: message: type: string description: '' examples: - 'Bitte um Rueckmeldung zur naechsten Schicht.' required: - message parameters: - in: path name: ticketId description: 'The ticket.' required: true schema: type: string examples: - 019f9939-c4c3-70fb-a54e-5ebf63db36d2 /api/v1/admin/auth/forgot-password: post: summary: 'Forgot Password' operationId: forgotPassword description: 'Sends a 4-digit password reset code to the given email address.' parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS message: type: string examples: - 'If that email address is registered, a password reset code has been sent.' data: type: object properties: email: type: string examples: - opal56@example.net code: type: string examples: - '448891' errors: type: - string - 'null' examples: - null meta: type: object properties: request_id: type: string examples: - 04e13c3e-6945-4f40-bb63-a330434430e3 timestamp: type: string examples: - '2026-08-05T16:18:54.164086Z' examples: - status: SUCCESS message: 'If that email address is registered, a password reset code has been sent.' data: email: opal56@example.net code: '448891' errors: null meta: request_id: 04e13c3e-6945-4f40-bb63-a330434430e3 timestamp: '2026-08-05T16:18:54.164086Z' 422: description: 'Validation Error' content: application/json: schema: type: object properties: status: type: string examples: - VALIDATION_ERROR message: type: string examples: - 'The given data was invalid.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: string examples: - guard message: type: string examples: - 'The guard field is required.' examples: - - field: guard message: 'The guard field is required.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: VALIDATION_ERROR message: 'The given data was invalid.' data: null errors: - field: guard message: 'The guard field is required.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' 429: description: 'Rate Limited' content: application/json: schema: type: object properties: status: type: string examples: - RATE_LIMITED message: type: string examples: - 'Too many requests.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: - string - 'null' examples: - null message: type: string examples: - 'Too many requests.' examples: - - field: null message: 'Too many requests.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-21T19:00:00.000000Z' examples: - status: RATE_LIMITED message: 'Too many requests.' data: null errors: - field: null message: 'Too many requests.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-21T19:00:00.000000Z' tags: - 'Organization API' requestBody: required: true content: application/json: schema: type: object properties: email: type: string description: 'Email address to send reset code to.' examples: - boris@example.com guard: type: string description: 'Actor type ("user", "organization", or "admin").' examples: - user required: - email - guard security: [] /api/v1/admin/auth/forgot-password/verify: post: summary: 'Verify Reset Code' operationId: verifyResetCode description: 'Validates the 4-digit password reset code for the given email and guard.' parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS message: type: string examples: - 'Reset code verified successfully.' data: type: object properties: reset_token: type: string examples: - c97701d0-c4de-4755-b3c4-f7d1a803efc5 errors: type: - string - 'null' examples: - null meta: type: object properties: request_id: type: string examples: - 67df2724-9771-46b5-8d4d-71f98573d3e5 timestamp: type: string examples: - '2026-08-05T16:18:54.166696Z' examples: - status: SUCCESS message: 'Reset code verified successfully.' data: reset_token: c97701d0-c4de-4755-b3c4-f7d1a803efc5 errors: null meta: request_id: 67df2724-9771-46b5-8d4d-71f98573d3e5 timestamp: '2026-08-05T16:18:54.166696Z' 401: description: 'Invalid Code' content: application/json: schema: type: object properties: status: type: string examples: - RESET_CODE_INVALID message: type: string examples: - 'Invalid reset code.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: string examples: - code message: type: string examples: - 'Invalid reset code.' examples: - - field: code message: 'Invalid reset code.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: RESET_CODE_INVALID message: 'Invalid reset code.' data: null errors: - field: code message: 'Invalid reset code.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' 410: description: 'Code Expired' content: application/json: schema: type: object properties: status: type: string examples: - RESET_CODE_EXPIRED message: type: string examples: - 'Reset code has expired.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: string examples: - code message: type: string examples: - 'Reset code has expired.' examples: - - field: code message: 'Reset code has expired.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: RESET_CODE_EXPIRED message: 'Reset code has expired.' data: null errors: - field: code message: 'Reset code has expired.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' 422: description: 'Validation Error' content: application/json: schema: type: object properties: status: type: string examples: - VALIDATION_ERROR message: type: string examples: - 'The given data was invalid.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: string examples: - code message: type: string examples: - 'The code field is required.' examples: - - field: code message: 'The code field is required.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: VALIDATION_ERROR message: 'The given data was invalid.' data: null errors: - field: code message: 'The code field is required.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' 429: description: 'Too Many Attempts' content: application/json: schema: type: object properties: status: type: string examples: - RESET_ATTEMPTS_EXHAUSTED message: type: string examples: - 'Too many failed attempts. Please request a new code.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: string examples: - code message: type: string examples: - 'Too many failed attempts. Please request a new code.' examples: - - field: code message: 'Too many failed attempts. Please request a new code.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: RESET_ATTEMPTS_EXHAUSTED message: 'Too many failed attempts. Please request a new code.' data: null errors: - field: code message: 'Too many failed attempts. Please request a new code.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' tags: - 'Organization API' requestBody: required: true content: application/json: schema: type: object properties: email: type: string description: 'Email address for password reset.' examples: - boris@example.com code: type: string description: '6-digit reset code.' examples: - '123456' guard: type: string description: 'Actor type ("user", "organization", or "admin").' examples: - user required: - email - code - guard security: [] /api/v1/admin/auth/forgot-password/resend: post: summary: 'Resend Reset Code' operationId: resendResetCode description: 'Re-sends a 4-digit password reset code for the given email and guard.' parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS message: type: string examples: - 'If that email address is registered, a new password reset code has been sent.' data: type: object properties: code: type: string examples: - '443677' errors: type: - string - 'null' examples: - null meta: type: object properties: request_id: type: string examples: - a265e26e-388c-4782-b9ce-bc4722cc5958 timestamp: type: string examples: - '2026-08-05T16:18:58.095803Z' examples: - status: SUCCESS message: 'If that email address is registered, a new password reset code has been sent.' data: code: '443677' errors: null meta: request_id: a265e26e-388c-4782-b9ce-bc4722cc5958 timestamp: '2026-08-05T16:18:58.095803Z' 422: description: 'Validation Error' content: application/json: schema: type: object properties: status: type: string examples: - VALIDATION_ERROR message: type: string examples: - 'The given data was invalid.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: string examples: - guard message: type: string examples: - 'The guard field is required.' examples: - - field: guard message: 'The guard field is required.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: VALIDATION_ERROR message: 'The given data was invalid.' data: null errors: - field: guard message: 'The guard field is required.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' 429: description: 'Rate Limited' content: application/json: schema: type: object properties: status: type: string examples: - RATE_LIMITED message: type: string examples: - 'Too many requests.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: - string - 'null' examples: - null message: type: string examples: - 'Too many requests.' examples: - - field: null message: 'Too many requests.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-21T19:00:00.000000Z' examples: - status: RATE_LIMITED message: 'Too many requests.' data: null errors: - field: null message: 'Too many requests.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-21T19:00:00.000000Z' tags: - 'Organization API' requestBody: required: true content: application/json: schema: type: object properties: email: type: string description: 'Email address to resend reset code to.' examples: - boris@example.com guard: type: string description: 'Actor type ("user", "organization", or "admin").' examples: - user required: - email - guard security: [] /api/v1/admin/auth/reset-password: post: summary: 'Reset Password' operationId: resetPassword description: 'Resets the password for any actor type and revokes all existing tokens.' parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS message: type: string examples: - 'Password has been reset successfully.' data: type: - string - 'null' examples: - null errors: type: - string - 'null' examples: - null meta: type: object properties: request_id: type: string examples: - 85c34424-2c5f-4d2e-aa97-5edf63d5d429 timestamp: type: string examples: - '2026-08-05T16:18:54.626775Z' examples: - status: SUCCESS message: 'Password has been reset successfully.' data: null errors: null meta: request_id: 85c34424-2c5f-4d2e-aa97-5edf63d5d429 timestamp: '2026-08-05T16:18:54.626775Z' 403: description: 'Email Not Verified' content: application/json: schema: type: object properties: status: type: string examples: - RESET_NOT_VERIFIED message: type: string examples: - 'Email not verified. Complete the verification step first.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: - string - 'null' examples: - null message: type: string examples: - 'Email not verified. Complete the verification step first.' examples: - - field: null message: 'Email not verified. Complete the verification step first.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: RESET_NOT_VERIFIED message: 'Email not verified. Complete the verification step first.' data: null errors: - field: null message: 'Email not verified. Complete the verification step first.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' 404: description: 'Account Not Found' content: application/json: schema: type: object properties: status: type: string examples: - ACCOUNT_NOT_FOUND message: type: string examples: - 'Account not found.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: - string - 'null' examples: - null message: type: string examples: - 'Account not found.' examples: - - field: null message: 'Account not found.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: ACCOUNT_NOT_FOUND message: 'Account not found.' data: null errors: - field: null message: 'Account not found.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' 422: description: '' content: application/json: schema: oneOf: - description: 'Validation Error' type: object properties: status: type: string examples: - VALIDATION_ERROR message: type: string examples: - 'The given data was invalid.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: string examples: - password message: type: string examples: - 'The password must be at least 8 characters.' examples: - - field: password message: 'The password must be at least 8 characters.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: VALIDATION_ERROR message: 'The given data was invalid.' data: null errors: - field: password message: 'The password must be at least 8 characters.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' - description: 'Password Reuse' type: object properties: status: type: string examples: - VALIDATION_ERROR message: type: string examples: - 'The given data was invalid.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: string examples: - password message: type: string examples: - 'You cannot reuse your last 3 passwords.' examples: - - field: password message: 'You cannot reuse your last 3 passwords.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: VALIDATION_ERROR message: 'The given data was invalid.' data: null errors: - field: password message: 'You cannot reuse your last 3 passwords.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' 429: description: 'Rate Limited' content: application/json: schema: type: object properties: status: type: string examples: - RATE_LIMITED message: type: string examples: - 'Too many requests.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: - string - 'null' examples: - null message: type: string examples: - 'Too many requests.' examples: - - field: null message: 'Too many requests.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-21T19:00:00.000000Z' examples: - status: RATE_LIMITED message: 'Too many requests.' data: null errors: - field: null message: 'Too many requests.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-21T19:00:00.000000Z' tags: - 'Organization API' requestBody: required: true content: application/json: schema: type: object properties: email: type: string description: 'Email address for account.' examples: - boris@example.com reset_token: type: string description: 'UUID from verify-reset-code step.' examples: - a1b2c3d4-e5f6-7890-abcd-ef1234567890 password: type: string description: 'New password (min 8, must be confirmed).' examples: - NewPassword123 password_confirmation: type: string description: 'Password confirmation.' examples: - NewPassword123 guard: type: string description: 'Actor type ("user", "organization", or "admin").' examples: - user required: - email - reset_token - password - password_confirmation - guard security: [] /api/v1/admin/auth/two-factor/challenge: post: summary: 'Two Factor Challenge' operationId: twoFactorChallenge description: 'Completes the two-factor authentication challenge for any guard.' parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS message: type: string examples: - 'Two-factor authentication verified successfully.' data: type: object properties: token: type: string examples: - 42|wMrUbv7gI4CRWxcRbQIldttPzbyXBl2z181bI8Yt86612731 refresh_token: type: string examples: - 43|VPtqTDVPb3gY2MF4mIkms7vJcLWgUA47iwIxRI8e34e4f629 expires_in: type: integer examples: - 900 user: type: object properties: id: type: string examples: - 019fd2b8-b86e-738d-8bfa-a29262a83558 email: type: string examples: - hansen.mohammad@example.org errors: type: - string - 'null' examples: - null meta: type: object properties: request_id: type: string examples: - 0ff1a162-0832-4ffa-9700-d0f30d00a580 timestamp: type: string examples: - '2026-08-05T16:19:09.319799Z' examples: - status: SUCCESS message: 'Two-factor authentication verified successfully.' data: token: 42|wMrUbv7gI4CRWxcRbQIldttPzbyXBl2z181bI8Yt86612731 refresh_token: 43|VPtqTDVPb3gY2MF4mIkms7vJcLWgUA47iwIxRI8e34e4f629 expires_in: 900 user: id: 019fd2b8-b86e-738d-8bfa-a29262a83558 email: hansen.mohammad@example.org errors: null meta: request_id: 0ff1a162-0832-4ffa-9700-d0f30d00a580 timestamp: '2026-08-05T16:19:09.319799Z' 401: description: '' content: application/json: schema: oneOf: - description: 'Invalid Code' type: object properties: status: type: string examples: - TWO_FACTOR_CODE_INVALID message: type: string examples: - 'The provided code is invalid or has expired.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: string examples: - code message: type: string examples: - 'The provided code is invalid or has expired.' examples: - - field: code message: 'The provided code is invalid or has expired.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: TWO_FACTOR_CODE_INVALID message: 'The provided code is invalid or has expired.' data: null errors: - field: code message: 'The provided code is invalid or has expired.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' - description: Unauthenticated type: object properties: status: type: string examples: - UNAUTHORIZED message: type: string examples: - Unauthenticated. data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: - string - 'null' examples: - null message: type: string examples: - Unauthenticated. examples: - - field: null message: Unauthenticated. meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: UNAUTHORIZED message: Unauthenticated. data: null errors: - field: null message: Unauthenticated. meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' 409: description: '2FA Not Configured' content: application/json: schema: type: object properties: status: type: string examples: - TWO_FACTOR_NOT_CONFIGURED message: type: string examples: - 'Two-factor authentication is not configured for this account.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: - string - 'null' examples: - null message: type: string examples: - 'Two-factor authentication is not configured for this account.' examples: - - field: null message: 'Two-factor authentication is not configured for this account.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: TWO_FACTOR_NOT_CONFIGURED message: 'Two-factor authentication is not configured for this account.' data: null errors: - field: null message: 'Two-factor authentication is not configured for this account.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' 422: description: 'Validation Error' content: application/json: schema: type: object properties: status: type: string examples: - VALIDATION_ERROR message: type: string examples: - 'The given data was invalid.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: string examples: - code message: type: string examples: - 'Either code or recovery_code is required.' examples: - - field: code message: 'Either code or recovery_code is required.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: VALIDATION_ERROR message: 'The given data was invalid.' data: null errors: - field: code message: 'Either code or recovery_code is required.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' 429: description: 'Rate Limited' content: application/json: schema: type: object properties: status: type: string examples: - RATE_LIMITED message: type: string examples: - 'Too many requests.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: - string - 'null' examples: - null message: type: string examples: - 'Too many requests.' examples: - - field: null message: 'Too many requests.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-21T19:00:00.000000Z' examples: - status: RATE_LIMITED message: 'Too many requests.' data: null errors: - field: null message: 'Too many requests.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-21T19:00:00.000000Z' tags: - 'Organization API' requestBody: required: false content: application/json: schema: type: object properties: code: type: - string - 'null' description: 'The OTP or TOTP code. Nullable if recovery_code is provided.' examples: - '123456' recovery_code: type: - string - 'null' description: 'The recovery code. Nullable if code is provided.' examples: - ABCD-1234-EFGH /api/v1/admin/auth/logout: post: summary: Logout operationId: logout description: 'Revokes the currently active Sanctum token for any guard.' parameters: [] responses: 204: description: Success content: text/plain: schema: type: string examples: - '' 401: description: Unauthenticated content: application/json: schema: type: object properties: status: type: string examples: - UNAUTHORIZED message: type: string examples: - Unauthenticated. data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: - string - 'null' examples: - null message: type: string examples: - Unauthenticated. examples: - - field: null message: Unauthenticated. meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: UNAUTHORIZED message: Unauthenticated. data: null errors: - field: null message: Unauthenticated. meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' 429: description: 'Rate Limited' content: application/json: schema: type: object properties: status: type: string examples: - RATE_LIMITED message: type: string examples: - 'Too many requests.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: - string - 'null' examples: - null message: type: string examples: - 'Too many requests.' examples: - - field: null message: 'Too many requests.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-21T19:00:00.000000Z' examples: - status: RATE_LIMITED message: 'Too many requests.' data: null errors: - field: null message: 'Too many requests.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-21T19:00:00.000000Z' tags: - 'Organization API' /api/v1/admin/auth/two-factor/enable: post: summary: 'Enable Two Factor' operationId: enableTwoFactor description: 'Initiates the 2FA setup flow for the authenticated user.' parameters: [] responses: 200: description: '' content: application/json: schema: oneOf: - description: Email type: object properties: status: type: string examples: - SUCCESS message: type: string examples: - 'Two-factor authentication initiated.' data: type: object properties: method: type: string examples: - email errors: type: - string - 'null' examples: - null meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: SUCCESS message: 'Two-factor authentication initiated.' data: method: email errors: null meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' - description: 'Recorded from a live call' type: object properties: status: type: string examples: - SUCCESS message: type: string examples: - 'Scan the QR code with your authenticator app, then confirm with the generated code.' data: type: object properties: method: type: string examples: - totp secret: type: string examples: - 6RL4HDCP2F4CDU27SRQOWOS454GFGIL6 qr_uri: type: string examples: - 'otpauth://totp/Flexxer%20Backend:019fd2b8-b36f-7307-92fb-5d28e58ef9f2?secret=6RL4HDCP2F4CDU27SRQOWOS454GFGIL6&issuer=Flexxer%20Backend&algorithm=SHA1&digits=6&period=30' errors: type: - string - 'null' examples: - null meta: type: object properties: request_id: type: string examples: - e9e9b449-d901-409b-a9b4-fd071002aa0e timestamp: type: string examples: - '2026-08-05T16:19:07.791377Z' examples: - status: SUCCESS message: 'Scan the QR code with your authenticator app, then confirm with the generated code.' data: method: totp secret: 6RL4HDCP2F4CDU27SRQOWOS454GFGIL6 qr_uri: 'otpauth://totp/Flexxer%20Backend:019fd2b8-b36f-7307-92fb-5d28e58ef9f2?secret=6RL4HDCP2F4CDU27SRQOWOS454GFGIL6&issuer=Flexxer%20Backend&algorithm=SHA1&digits=6&period=30' errors: null meta: request_id: e9e9b449-d901-409b-a9b4-fd071002aa0e timestamp: '2026-08-05T16:19:07.791377Z' 401: description: Unauthenticated content: application/json: schema: type: object properties: status: type: string examples: - UNAUTHORIZED message: type: string examples: - Unauthenticated. data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: - string - 'null' examples: - null message: type: string examples: - Unauthenticated. examples: - - field: null message: Unauthenticated. meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: UNAUTHORIZED message: Unauthenticated. data: null errors: - field: null message: Unauthenticated. meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' 422: description: 'Validation Error' content: application/json: schema: type: object properties: status: type: string examples: - VALIDATION_ERROR message: type: string examples: - 'The given data was invalid.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: string examples: - method message: type: string examples: - 'The selected method is invalid.' examples: - - field: method message: 'The selected method is invalid.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: VALIDATION_ERROR message: 'The given data was invalid.' data: null errors: - field: method message: 'The selected method is invalid.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' 429: description: 'Rate Limited' content: application/json: schema: type: object properties: status: type: string examples: - RATE_LIMITED message: type: string examples: - 'Too many requests.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: - string - 'null' examples: - null message: type: string examples: - 'Too many requests.' examples: - - field: null message: 'Too many requests.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-21T19:00:00.000000Z' examples: - status: RATE_LIMITED message: 'Too many requests.' data: null errors: - field: null message: 'Too many requests.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-21T19:00:00.000000Z' tags: - 'Organization API' requestBody: required: true content: application/json: schema: type: object properties: method: type: string description: 'The 2FA method to enable.' enum: - email - 'totp. Allowed: email' - totp examples: - totp required: - method /api/v1/admin/auth/two-factor/confirm: post: summary: 'Confirm Two Factor' operationId: confirmTwoFactor description: 'Confirms and activates 2FA after the user has verified their code.' parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS message: type: string examples: - 'Two-factor authentication has been enabled. Save your recovery codes in a safe place.' data: type: object properties: recovery_codes: type: array items: type: string examples: - - DTPLO-U2SCF - MRWS1-IKBUY - MVM4F-Z42ES - AUSXU-FTDPK - U7WHX-TIU99 - 12AWU-NZVH6 - ZY5XK-4WOKJ - 47MAL-ZSDLU errors: type: - string - 'null' examples: - null meta: type: object properties: request_id: type: string examples: - 315aafcb-764e-4f38-9faa-b9c4f45e3461 timestamp: type: string examples: - '2026-08-05T16:19:07.807225Z' examples: - status: SUCCESS message: 'Two-factor authentication has been enabled. Save your recovery codes in a safe place.' data: recovery_codes: - DTPLO-U2SCF - MRWS1-IKBUY - MVM4F-Z42ES - AUSXU-FTDPK - U7WHX-TIU99 - 12AWU-NZVH6 - ZY5XK-4WOKJ - 47MAL-ZSDLU errors: null meta: request_id: 315aafcb-764e-4f38-9faa-b9c4f45e3461 timestamp: '2026-08-05T16:19:07.807225Z' 401: description: '' content: application/json: schema: oneOf: - description: 'Invalid Code' type: object properties: status: type: string examples: - TWO_FACTOR_CODE_INVALID message: type: string examples: - 'The provided code is invalid or has expired.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: string examples: - code message: type: string examples: - 'The provided code is invalid or has expired.' examples: - - field: code message: 'The provided code is invalid or has expired.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: TWO_FACTOR_CODE_INVALID message: 'The provided code is invalid or has expired.' data: null errors: - field: code message: 'The provided code is invalid or has expired.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' - description: Unauthenticated type: object properties: status: type: string examples: - UNAUTHORIZED message: type: string examples: - Unauthenticated. data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: - string - 'null' examples: - null message: type: string examples: - Unauthenticated. examples: - - field: null message: Unauthenticated. meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: UNAUTHORIZED message: Unauthenticated. data: null errors: - field: null message: Unauthenticated. meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' 409: description: 'No Pending Setup' content: application/json: schema: type: object properties: status: type: string examples: - TWO_FACTOR_NO_PENDING_SETUP message: type: string examples: - 'No pending two-factor setup found. Please restart the setup process.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: - string - 'null' examples: - null message: type: string examples: - 'No pending two-factor setup found. Please restart the setup process.' examples: - - field: null message: 'No pending two-factor setup found. Please restart the setup process.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: TWO_FACTOR_NO_PENDING_SETUP message: 'No pending two-factor setup found. Please restart the setup process.' data: null errors: - field: null message: 'No pending two-factor setup found. Please restart the setup process.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' 422: description: 'Validation Error' content: application/json: schema: type: object properties: status: type: string examples: - VALIDATION_ERROR message: type: string examples: - 'The given data was invalid.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: string examples: - code message: type: string examples: - 'The code field is required.' examples: - - field: code message: 'The code field is required.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-02T12:00:00.000000Z' examples: - status: VALIDATION_ERROR message: 'The given data was invalid.' data: null errors: - field: code message: 'The code field is required.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-02T12:00:00.000000Z' 429: description: 'Rate Limited' content: application/json: schema: type: object properties: status: type: string examples: - RATE_LIMITED message: type: string examples: - 'Too many requests.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: - string - 'null' examples: - null message: type: string examples: - 'Too many requests.' examples: - - field: null message: 'Too many requests.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-21T19:00:00.000000Z' examples: - status: RATE_LIMITED message: 'Too many requests.' data: null errors: - field: null message: 'Too many requests.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-21T19:00:00.000000Z' tags: - 'Organization API' requestBody: required: true content: application/json: schema: type: object properties: code: type: string description: 'The OTP or TOTP code to verify.' examples: - '123456' required: - code /api/v1/admin/auth/two-factor/disable: delete: summary: 'Disable Two Factor' operationId: disableTwoFactor description: "Disables 2FA for the authenticated user after verifying a current\nchallenge code — the same proof the user provides at login time." parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS message: type: string examples: - 'Two-factor authentication has been disabled.' data: type: - string - 'null' examples: - null errors: type: - string - 'null' examples: - null meta: type: object properties: request_id: type: string examples: - 255f0d6e-8c58-4e47-84a4-c47dd821febf timestamp: type: string examples: - '2026-08-05T16:19:07.817111Z' examples: - status: SUCCESS message: 'Two-factor authentication has been disabled.' data: null errors: null meta: request_id: 255f0d6e-8c58-4e47-84a4-c47dd821febf timestamp: '2026-08-05T16:19:07.817111Z' 401: description: 'Invalid Code' content: application/json: schema: type: object properties: status: type: string examples: - TWO_FACTOR_CODE_INVALID message: type: string examples: - 'The provided code is invalid or has expired.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: string examples: - code message: type: string examples: - 'The provided code is invalid or has expired.' examples: - - field: code message: 'The provided code is invalid or has expired.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-22T12:00:00.000000Z' examples: - status: TWO_FACTOR_CODE_INVALID message: 'The provided code is invalid or has expired.' data: null errors: - field: code message: 'The provided code is invalid or has expired.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-22T12:00:00.000000Z' 409: description: 'Not Enabled' content: application/json: schema: type: object properties: status: type: string examples: - TWO_FACTOR_NOT_ENABLED message: type: string examples: - 'Two-factor authentication is not currently enabled.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: - string - 'null' examples: - null message: type: string examples: - 'Two-factor authentication is not currently enabled.' examples: - - field: null message: 'Two-factor authentication is not currently enabled.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-22T12:00:00.000000Z' examples: - status: TWO_FACTOR_NOT_ENABLED message: 'Two-factor authentication is not currently enabled.' data: null errors: - field: null message: 'Two-factor authentication is not currently enabled.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-22T12:00:00.000000Z' 422: description: 'Validation Error' content: application/json: schema: type: object properties: status: type: string examples: - VALIDATION_ERROR message: type: string examples: - 'The given data was invalid.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: string examples: - code message: type: string examples: - 'Either code or recovery_code is required.' examples: - - field: code message: 'Either code or recovery_code is required.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-22T12:00:00.000000Z' examples: - status: VALIDATION_ERROR message: 'The given data was invalid.' data: null errors: - field: code message: 'Either code or recovery_code is required.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-22T12:00:00.000000Z' tags: - 'Organization API' requestBody: required: false content: application/json: schema: type: object properties: code: type: - string - 'null' description: '6-digit TOTP or email OTP. Required unless `recovery_code` is provided.' examples: - '123456' recovery_code: type: - string - 'null' description: 'Recovery code in place of `code`.' examples: - ABCD-1234-EFGH /api/v1/admin/auth/two-factor/disable/request-code: post: summary: 'Request Disable Two Factor Code' operationId: requestDisableTwoFactorCode description: "Dispatches a 6-digit OTP to the user's account email so they can\nconfirm a 2FA-disable request. No-op for TOTP accounts (the code\ncomes from the authenticator app directly) and for accounts without\nan enabled 2FA setting — both return 200 so the client's happy path\nis uniform." parameters: [] responses: 200: description: '' content: application/json: schema: oneOf: - description: 'TOTP — use authenticator' type: object properties: status: type: string examples: - SUCCESS message: type: string examples: - 'Enter the current code from your authenticator app.' data: type: object properties: method: type: string examples: - totp errors: type: - string - 'null' examples: - null meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-22T12:00:00.000000Z' examples: - status: SUCCESS message: 'Enter the current code from your authenticator app.' data: method: totp errors: null meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-22T12:00:00.000000Z' - description: 'Recorded from a live call' type: object properties: status: type: string examples: - SUCCESS message: type: string examples: - 'Enter the current code from your authenticator app.' data: type: object properties: method: type: string examples: - totp errors: type: - string - 'null' examples: - null meta: type: object properties: request_id: type: string examples: - 0542b19f-0c0a-4bf3-93a4-d90bbac46f63 timestamp: type: string examples: - '2026-08-05T16:18:37.138042Z' examples: - status: SUCCESS message: 'Enter the current code from your authenticator app.' data: method: totp errors: null meta: request_id: 0542b19f-0c0a-4bf3-93a4-d90bbac46f63 timestamp: '2026-08-05T16:18:37.138042Z' 409: description: 'Not Enabled' content: application/json: schema: type: object properties: status: type: string examples: - TWO_FACTOR_NOT_ENABLED message: type: string examples: - 'Two-factor authentication is not currently enabled.' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: - string - 'null' examples: - null message: type: string examples: - 'Two-factor authentication is not currently enabled.' examples: - - field: null message: 'Two-factor authentication is not currently enabled.' meta: type: object properties: request_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 timestamp: type: string examples: - '2026-04-22T12:00:00.000000Z' examples: - status: TWO_FACTOR_NOT_ENABLED message: 'Two-factor authentication is not currently enabled.' data: null errors: - field: null message: 'Two-factor authentication is not currently enabled.' meta: request_id: 550e8400-e29b-41d4-a716-446655440000 timestamp: '2026-04-22T12:00:00.000000Z' tags: - 'Organization API' '/api/v1/admin/employees/{profileId}/sanction': post: summary: "Apply a sanction to a worker who was sent home or breached the rules. The\nadmin chooses the consequence: suspension days, a payment treatment\n(full / partial / none / goodwill) and/or a warning (Ermahnung)." operationId: applyASanctionToAWorkerWhoWasSentHomeOrBreachedTheRulesTheAdminChoosesTheConsequenceSuspensionDaysAPaymentTreatmentfullPartialNoneGoodwillAndorAWarningErmahnung description: '' parameters: [] responses: { } tags: - 'Admin - Employees' requestBody: required: true content: application/json: schema: type: object properties: reason: type: string description: 'Shared reason for the sanction.' examples: - 'Wiederholtes Zuspätkommen' suspension_days: type: integer description: 'Days to suspend the worker.' examples: - 7 payment_treatment: type: string description: 'Allowed: full, partial, none, goodwill.' examples: - partial issue_warning: type: boolean description: 'Send a warning notification.' examples: - true shift_id: type: string description: 'Optional related shift UUID.' examples: - architecto required: - reason parameters: - in: path name: profileId description: '' required: true schema: type: string examples: - architecto /api/v1/admin/lhr/payroll/approval-requests: post: summary: 'Request Payroll Approval' operationId: requestPayrollApproval description: "Opens a four-eyes approval request for a payroll period.\nA different admin with `admin.payroll.trigger` must then approve it\nbefore the payroll trigger endpoint will accept the approval_id." parameters: [] responses: 201: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - CREATED message: type: string examples: - 'Approval request opened.' data: type: object properties: id: type: string examples: - 019fd2b8-53e2-72c9-afe8-17239fd1a8e1 period: type: string examples: - 2026-06 status: type: string examples: - pending requested_by_id: type: string examples: - 019fd2b7-edab-7280-b09f-b18f58a272ee created_at: type: string examples: - '2026-08-05T16:18:43.000000Z' errors: type: - string - 'null' examples: - null meta: type: object properties: request_id: type: string examples: - b7e77921-3f4d-4d85-83af-84afa8e7b97e timestamp: type: string examples: - '2026-08-05T16:18:43.305161Z' examples: - status: CREATED message: 'Approval request opened.' data: id: 019fd2b8-53e2-72c9-afe8-17239fd1a8e1 period: 2026-06 status: pending requested_by_id: 019fd2b7-edab-7280-b09f-b18f58a272ee created_at: '2026-08-05T16:18:43.000000Z' errors: null meta: request_id: b7e77921-3f4d-4d85-83af-84afa8e7b97e timestamp: '2026-08-05T16:18:43.305161Z' 409: description: '' content: application/json: schema: type: object properties: status: type: string examples: - CONFLICT message: type: string examples: - 'An open approval request already exists for this period.' examples: - status: CONFLICT message: 'An open approval request already exists for this period.' 422: description: '' content: application/json: schema: type: object properties: status: type: string examples: - VALIDATION_ERROR message: type: string examples: - 'This period has already been executed.' examples: - status: VALIDATION_ERROR message: 'This period has already been executed.' tags: - 'Admin - LHR Payroll' requestBody: required: true content: application/json: schema: type: object properties: period: type: string description: 'Payroll period in YYYY-MM format.' examples: - 2026-06 required: - period '/api/v1/admin/lhr/payroll/approval-requests/{approval_id}': put: summary: 'Approve Payroll Approval Request' operationId: approvePayrollApprovalRequest description: "Approves a pending four-eyes payroll approval request.\nThe approver must be a different admin from the requester." parameters: [] responses: 200: description: '' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS message: type: string examples: - 'Approval granted.' data: type: object properties: id: type: string examples: - uuid period: type: string examples: - 2026-06 status: type: string examples: - approved approved_by_id: type: string examples: - uuid approved_at: type: string examples: - '2026-06-14T10:05:00.000000Z' examples: - status: SUCCESS message: 'Approval granted.' data: id: uuid period: 2026-06 status: approved approved_by_id: uuid approved_at: '2026-06-14T10:05:00.000000Z' 403: description: '' content: application/json: schema: type: object properties: status: type: string examples: - FORBIDDEN message: type: string examples: - 'The requester cannot approve their own request.' examples: - status: FORBIDDEN message: 'The requester cannot approve their own request.' 422: description: '' content: application/json: schema: type: object properties: status: type: string examples: - VALIDATION_ERROR message: type: string examples: - 'This approval request is not in a pending state.' examples: - status: VALIDATION_ERROR message: 'This approval request is not in a pending state.' tags: - 'Admin - LHR Payroll' parameters: - in: path name: approval_id description: 'The ID of the approval.' required: true schema: type: string examples: - architecto - in: path name: approval description: 'UUID of the approval request.' required: true schema: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 '/api/v1/admin/lhr/payroll/approval-requests/{approval_id}/reject': put: summary: 'Reject Payroll Approval Request' operationId: rejectPayrollApprovalRequest description: "Declines a pending four-eyes payroll approval request, closing the period\nto payroll until a new request is raised. The reviewer must be a different\nadmin from the requester, and must say why — the requester needs to know\nwhat to change before asking again." parameters: [] responses: 200: description: '' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS message: type: string examples: - 'Approval rejected.' data: type: object properties: id: type: string examples: - uuid period: type: string examples: - 2026-06 status: type: string examples: - rejected approved_by_id: type: string examples: - uuid approved_at: type: string examples: - '2026-06-14T10:05:00.000000Z' rejection_reason: type: string examples: - 'Overtime for the Graz site is still unconfirmed.' examples: - status: SUCCESS message: 'Approval rejected.' data: id: uuid period: 2026-06 status: rejected approved_by_id: uuid approved_at: '2026-06-14T10:05:00.000000Z' rejection_reason: 'Overtime for the Graz site is still unconfirmed.' 403: description: '' content: application/json: schema: type: object properties: status: type: string examples: - FORBIDDEN message: type: string examples: - 'The requester cannot approve their own request.' examples: - status: FORBIDDEN message: 'The requester cannot approve their own request.' 422: description: '' content: application/json: schema: type: object properties: status: type: string examples: - VALIDATION_ERROR message: type: string examples: - 'This approval request is not in a pending state.' examples: - status: VALIDATION_ERROR message: 'This approval request is not in a pending state.' tags: - 'Admin - LHR Payroll' requestBody: required: true content: application/json: schema: type: object properties: reason: type: string description: 'Why the request was declined (max 1000).' examples: - 'Overtime for the Graz site is still unconfirmed.' required: - reason parameters: - in: path name: approval_id description: 'The ID of the approval.' required: true schema: type: string examples: - architecto - in: path name: approval description: 'UUID of the approval request.' required: true schema: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 /api/v1/admin/lhr/payroll/trigger: post: summary: 'Trigger LHR payroll.' operationId: triggerLHRPayroll description: "Trigger monthly payroll calculation in LHR.\n\nRequires a pre-approved four-eyes approval record. The `approval_id`\nmust reference a PayrollApproval in `approved` state for the same\nperiod, approved by a different admin than the caller who requested it." parameters: [] responses: 202: description: '' content: application/json: schema: type: object properties: status: type: string examples: - success message: type: string examples: - 'Payroll calculation triggered' data: type: object properties: abrechnung_id: type: string examples: - abc-123 period: type: string examples: - 2026-01 status: type: string examples: - queued examples: - status: success message: 'Payroll calculation triggered' data: abrechnung_id: abc-123 period: 2026-01 status: queued 422: description: '' content: application/json: schema: type: object properties: status: type: string examples: - VALIDATION_ERROR message: type: string examples: - 'Approval is not in an approved state.' examples: - status: VALIDATION_ERROR message: 'Approval is not in an approved state.' 503: description: '' content: application/json: schema: type: object properties: status: type: string examples: - error message: type: string examples: - 'LHR service unavailable' examples: - status: error message: 'LHR service unavailable' tags: - 'Admin - LHR Payroll' requestBody: required: true content: application/json: schema: type: object properties: period: type: string description: 'The payroll period in YYYY-MM format.' examples: - 2026-01 approval_id: type: string description: 'UUID of an approved PayrollApproval for this period.' examples: - architecto required: - period - approval_id '/api/v1/admin/lhr/payroll/{abrechnungId}/status': get: summary: 'Get payroll calculation status from LHR.' operationId: getPayrollCalculationStatusFromLHR description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object properties: status: type: string examples: - ERROR message: type: string examples: - 'Service Unavailable' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: - string - 'null' examples: - null message: type: string examples: - 'Service Unavailable' examples: - - field: null message: 'Service Unavailable' meta: type: object properties: request_id: type: string examples: - 83b111e4-96dc-4495-ba19-ba40d5076dc9 timestamp: type: string examples: - '2026-08-21T05:14:36.862690Z' examples: - status: ERROR message: 'Service Unavailable' data: null errors: - field: null message: 'Service Unavailable' meta: request_id: 83b111e4-96dc-4495-ba19-ba40d5076dc9 timestamp: '2026-08-21T05:14:36.862690Z' tags: - 'Admin - LHR Payroll' parameters: - in: path name: abrechnungId description: '' required: true schema: type: string examples: - architecto '/api/v1/admin/lhr/payroll/{abrechnungId}/results': get: summary: 'Get payroll results from LHR.' operationId: getPayrollResultsFromLHR description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object properties: status: type: string examples: - ERROR message: type: string examples: - 'Service Unavailable' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: - string - 'null' examples: - null message: type: string examples: - 'Service Unavailable' examples: - - field: null message: 'Service Unavailable' meta: type: object properties: request_id: type: string examples: - 524f03f5-0c13-41af-82bd-26b21bef8af1 timestamp: type: string examples: - '2026-08-21T05:14:36.871506Z' examples: - status: ERROR message: 'Service Unavailable' data: null errors: - field: null message: 'Service Unavailable' meta: request_id: 524f03f5-0c13-41af-82bd-26b21bef8af1 timestamp: '2026-08-21T05:14:36.871506Z' tags: - 'Admin - LHR Payroll' parameters: - in: path name: abrechnungId description: '' required: true schema: type: string examples: - architecto /api/v1/admin/lhr/dienstnehmer/sync: post: summary: 'Sync employee data with LHR.' operationId: syncEmployeeDataWithLHR description: '' parameters: [] responses: { } tags: - 'Admin - LHR Payroll' requestBody: required: true content: application/json: schema: type: object properties: user_id: type: string description: '' examples: - 019f9939-c4c3-70fb-a54e-5ebf63db36d2 required: - user_id '/api/v1/admin/lhr/users/{userId}/documents': get: summary: 'List employee documents from LHR.' operationId: listEmployeeDocumentsFromLHR description: '' parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS data: type: object properties: documents: type: array examples: - [] examples: - status: SUCCESS data: documents: [] tags: - 'Admin - LHR Payroll' parameters: - in: path name: userId description: '' required: true schema: type: string examples: - architecto '/api/v1/admin/lhr/users/{userId}/payslip': get: summary: 'Download payslips from LHR.' operationId: downloadPayslipsFromLHR description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object properties: status: type: string examples: - ERROR message: type: string examples: - 'Service Unavailable' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: - string - 'null' examples: - null message: type: string examples: - 'Service Unavailable' examples: - - field: null message: 'Service Unavailable' meta: type: object properties: request_id: type: string examples: - 25d24af1-490a-490e-878a-158c3d0a4b2e timestamp: type: string examples: - '2026-08-21T05:14:36.907967Z' examples: - status: ERROR message: 'Service Unavailable' data: null errors: - field: null message: 'Service Unavailable' meta: request_id: 25d24af1-490a-490e-878a-158c3d0a4b2e timestamp: '2026-08-21T05:14:36.907967Z' tags: - 'Admin - LHR Payroll' parameters: - in: path name: userId description: '' required: true schema: type: string examples: - architecto '/api/v1/admin/shifts/{shiftId}/resolve-dispute': post: summary: 'Resolve an attendance hours dispute (conflict) raised during check-out.' operationId: resolveAnAttendanceHoursDisputeconflictRaisedDuringCheckOut description: '' parameters: [] responses: { } tags: - 'Admin - Shifts' requestBody: required: true content: application/json: schema: type: object properties: resolution: type: string description: 'How the dispute was resolved.' examples: - 'Stunden laut Anwesenheitsliste bestätigt.' required: - resolution parameters: - in: path name: shiftId description: '' required: true schema: type: string examples: - architecto /api/v1/org/shifts/assignments: get: summary: 'List all shift assignments for the organization.' operationId: listAllShiftAssignmentsForTheOrganization description: '' parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS data: type: object properties: assignments: type: array items: type: object properties: id: type: string examples: - 019fd2b8-1636-72ac-b1d9-8d969732067e status: type: string examples: - signed status_label: type: string examples: - Unterschrieben shift_date: type: string examples: - '2026-08-25' scheduled_start_time: type: string examples: - '08:00:00' scheduled_end_time: type: string examples: - '16:00:00' location_name: type: string examples: - 'MuseumsQuartier Wien' location_address: type: string examples: - 'Museumsplatz 1, 1070 Wien' hourly_rate_gross: type: string examples: - '14.00' confirmed_at: type: string examples: - '2026-08-22 00:00' started_at: type: - string - 'null' examples: - null completed_at: type: - string - 'null' examples: - null job: type: object properties: id: type: string examples: - 019fd2b8-1628-73ae-86e5-b232f0363a96 title: type: string examples: - 'Event-Fotograf Assistent' category: type: string examples: - Events employee: type: object properties: id: type: string examples: - 019fd2b8-0d32-71d1-98de-ce0b40a5b75d name: type: string examples: - 'Andreas Weber' email: type: string examples: - andreas.weber12@demo-employee.at city: type: string examples: - Linz examples: - - id: 019fd2b8-1636-72ac-b1d9-8d969732067e status: signed status_label: Unterschrieben shift_date: '2026-08-25' scheduled_start_time: '08:00:00' scheduled_end_time: '16:00:00' location_name: 'MuseumsQuartier Wien' location_address: 'Museumsplatz 1, 1070 Wien' hourly_rate_gross: '14.00' confirmed_at: '2026-08-22 00:00' started_at: null completed_at: null job: id: 019fd2b8-1628-73ae-86e5-b232f0363a96 title: 'Event-Fotograf Assistent' category: Events employee: id: 019fd2b8-0d32-71d1-98de-ce0b40a5b75d name: 'Andreas Weber' email: andreas.weber12@demo-employee.at city: Linz - id: 019fd2b8-18c6-71d1-9d10-c4ee02fbff17 status: signed status_label: Unterschrieben shift_date: '2026-08-07' scheduled_start_time: '08:00:00' scheduled_end_time: '16:00:00' location_name: 'H&M Mariahilfer' location_address: 'Mariahilfer Straße 42, 1070 Wien' hourly_rate_gross: '13.50' confirmed_at: '2026-08-06 00:00' started_at: null completed_at: null job: id: 019fd2b8-18bd-713e-8faf-09b99d95cb72 title: 'Kassiere*r Modegeschäft' category: Einzelhandel employee: id: 019fd2b8-02bf-72ff-a65c-330126050c95 name: 'Stefan Müller' email: stefan.müller0@demo-employee.at city: Wien - id: 019fd2b8-28d3-70d7-92eb-f1bb1577acaf status: signed status_label: Unterschrieben shift_date: '2026-08-06' scheduled_start_time: '08:00:00' scheduled_end_time: '16:00:00' location_name: Nolan-Roberts location_address: "4309 O'Reilly Way Suite 012" hourly_rate_gross: '34.72' confirmed_at: null started_at: null completed_at: null job: id: 019fd2b8-28c4-732f-a94c-fb5a71a7d682 title: Accountant category: Büro employee: id: 019fd2b7-f271-73fd-8268-848be381e136 name: 'Anna Neuling' email: pending@demo.flexxr.at city: Linz - id: 019fd2b8-28d8-728d-a447-8de1a42eec83 status: checked_in status_label: Eingecheckt shift_date: '2026-08-05' scheduled_start_time: '11:58:00' scheduled_end_time: '12:13:00' location_name: 'Goldner and Sons' location_address: '30005 Prosacco Orchard' hourly_rate_gross: '18.57' confirmed_at: null started_at: null completed_at: null job: id: 019fd2b8-28c4-732f-a94c-fb5a71a7d682 title: Accountant category: Büro employee: id: 019fd2b7-f271-73fd-8268-848be381e136 name: 'Anna Neuling' email: pending@demo.flexxr.at city: Linz - id: 019fd2b8-28df-7265-8b1e-cb5de026e4d7 status: completed status_label: Abgeschlossen shift_date: '2026-08-03' scheduled_start_time: '08:31:00' scheduled_end_time: '05:12:00' location_name: 'Wehner Inc' location_address: '45222 Hansen Gardens' hourly_rate_gross: '18.25' confirmed_at: null started_at: null completed_at: null job: id: 019fd2b8-28c4-732f-a94c-fb5a71a7d682 title: Accountant category: Büro employee: id: 019fd2b7-f271-73fd-8268-848be381e136 name: 'Anna Neuling' email: pending@demo.flexxr.at city: Linz summary: type: object properties: total: type: integer examples: - 5 by_status: type: object properties: confirmed: type: integer examples: - 3 in_progress: type: integer examples: - 1 completed: type: integer examples: - 1 today: type: integer examples: - 1 this_week: type: integer examples: - 3 meta: type: object properties: current_page: type: integer examples: - 1 last_page: type: integer examples: - 1 per_page: type: integer examples: - 20 total: type: integer examples: - 5 examples: - status: SUCCESS data: assignments: - id: 019fd2b8-1636-72ac-b1d9-8d969732067e status: signed status_label: Unterschrieben shift_date: '2026-08-25' scheduled_start_time: '08:00:00' scheduled_end_time: '16:00:00' location_name: 'MuseumsQuartier Wien' location_address: 'Museumsplatz 1, 1070 Wien' hourly_rate_gross: '14.00' confirmed_at: '2026-08-22 00:00' started_at: null completed_at: null job: id: 019fd2b8-1628-73ae-86e5-b232f0363a96 title: 'Event-Fotograf Assistent' category: Events employee: id: 019fd2b8-0d32-71d1-98de-ce0b40a5b75d name: 'Andreas Weber' email: andreas.weber12@demo-employee.at city: Linz - id: 019fd2b8-18c6-71d1-9d10-c4ee02fbff17 status: signed status_label: Unterschrieben shift_date: '2026-08-07' scheduled_start_time: '08:00:00' scheduled_end_time: '16:00:00' location_name: 'H&M Mariahilfer' location_address: 'Mariahilfer Straße 42, 1070 Wien' hourly_rate_gross: '13.50' confirmed_at: '2026-08-06 00:00' started_at: null completed_at: null job: id: 019fd2b8-18bd-713e-8faf-09b99d95cb72 title: 'Kassiere*r Modegeschäft' category: Einzelhandel employee: id: 019fd2b8-02bf-72ff-a65c-330126050c95 name: 'Stefan Müller' email: stefan.müller0@demo-employee.at city: Wien - id: 019fd2b8-28d3-70d7-92eb-f1bb1577acaf status: signed status_label: Unterschrieben shift_date: '2026-08-06' scheduled_start_time: '08:00:00' scheduled_end_time: '16:00:00' location_name: Nolan-Roberts location_address: "4309 O'Reilly Way Suite 012" hourly_rate_gross: '34.72' confirmed_at: null started_at: null completed_at: null job: id: 019fd2b8-28c4-732f-a94c-fb5a71a7d682 title: Accountant category: Büro employee: id: 019fd2b7-f271-73fd-8268-848be381e136 name: 'Anna Neuling' email: pending@demo.flexxr.at city: Linz - id: 019fd2b8-28d8-728d-a447-8de1a42eec83 status: checked_in status_label: Eingecheckt shift_date: '2026-08-05' scheduled_start_time: '11:58:00' scheduled_end_time: '12:13:00' location_name: 'Goldner and Sons' location_address: '30005 Prosacco Orchard' hourly_rate_gross: '18.57' confirmed_at: null started_at: null completed_at: null job: id: 019fd2b8-28c4-732f-a94c-fb5a71a7d682 title: Accountant category: Büro employee: id: 019fd2b7-f271-73fd-8268-848be381e136 name: 'Anna Neuling' email: pending@demo.flexxr.at city: Linz - id: 019fd2b8-28df-7265-8b1e-cb5de026e4d7 status: completed status_label: Abgeschlossen shift_date: '2026-08-03' scheduled_start_time: '08:31:00' scheduled_end_time: '05:12:00' location_name: 'Wehner Inc' location_address: '45222 Hansen Gardens' hourly_rate_gross: '18.25' confirmed_at: null started_at: null completed_at: null job: id: 019fd2b8-28c4-732f-a94c-fb5a71a7d682 title: Accountant category: Büro employee: id: 019fd2b7-f271-73fd-8268-848be381e136 name: 'Anna Neuling' email: pending@demo.flexxr.at city: Linz summary: total: 5 by_status: confirmed: 3 in_progress: 1 completed: 1 today: 1 this_week: 3 meta: current_page: 1 last_page: 1 per_page: 20 total: 5 tags: - 'Company - Assignments' '/api/v1/org/shifts/assignments/{assignmentId}/timeline': get: summary: 'Get the full audit trail for a single assignment (shift).' operationId: getTheFullAuditTrailForASingleAssignmentshift description: "Returns the assignment summary (incl. contract status + download URL) and\na chronological event timeline covering the whole lifecycle: contract\nsigned/countersigned, clock-in/out, completion, hours confirm/dispute,\nsignature refusal, no-show incidents and invoice lines." parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS data: type: object properties: assignment: type: object properties: id: type: string examples: - 019fd2b8-28d1-7112-b8e9-68bd79fbafb9 status: type: string examples: - awaiting_signature status_label: type: string examples: - 'Unterschrift ausstehend' shift_date: type: string examples: - '2026-08-04' scheduled_start_time: type: string examples: - '16:57:00' scheduled_end_time: type: string examples: - '09:21:00' location_name: type: string examples: - Buckridge-Collier location_address: type: string examples: - '661 Cayla Unions Suite 344' hourly_rate_gross: type: string examples: - '27.68' started_at: type: - string - 'null' examples: - null completed_at: type: - string - 'null' examples: - null job: type: object properties: id: type: string examples: - 019fd2b8-28c4-732f-a94c-fb5a71a7d682 title: type: string examples: - Accountant employee: type: object properties: id: type: string examples: - 019fd2b7-f271-73fd-8268-848be381e136 name: type: string examples: - 'Anna Neuling' contract: type: - string - 'null' examples: - null attendance: type: - string - 'null' examples: - null rating: type: - string - 'null' examples: - null timeline: type: array items: type: object properties: event_type: type: string examples: - assignment.created actor: type: string examples: - system title: type: string examples: - 'Assignment created' description: type: string examples: - 'Assignment was created from job selection.' occurred_at: type: string examples: - '2026-08-05T16:18:32+00:00' path: type: string examples: - /hours examples: - - event_type: assignment.created actor: system title: 'Assignment created' description: 'Assignment was created from job selection.' occurred_at: '2026-08-05T16:18:32+00:00' path: /hours examples: - status: SUCCESS data: assignment: id: 019fd2b8-28d1-7112-b8e9-68bd79fbafb9 status: awaiting_signature status_label: 'Unterschrift ausstehend' shift_date: '2026-08-04' scheduled_start_time: '16:57:00' scheduled_end_time: '09:21:00' location_name: Buckridge-Collier location_address: '661 Cayla Unions Suite 344' hourly_rate_gross: '27.68' started_at: null completed_at: null job: id: 019fd2b8-28c4-732f-a94c-fb5a71a7d682 title: Accountant employee: id: 019fd2b7-f271-73fd-8268-848be381e136 name: 'Anna Neuling' contract: null attendance: null rating: null timeline: - event_type: assignment.created actor: system title: 'Assignment created' description: 'Assignment was created from job selection.' occurred_at: '2026-08-05T16:18:32+00:00' path: /hours 404: description: 'Not Found' content: application/json: schema: type: object properties: status: type: string examples: - NOT_FOUND message: type: string examples: - 'Assignment not found.' examples: - status: NOT_FOUND message: 'Assignment not found.' tags: - 'Company - Assignments' parameters: - in: path name: assignmentId description: 'The UUID of the shift/assignment.' required: true schema: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 /api/v1/org/shifts/attendance: get: summary: 'List attendance records for shifts.' operationId: listAttendanceRecordsForShifts description: '' parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS data: type: object properties: records: type: array items: type: object properties: id: type: string examples: - 019fd2b8-28d8-728d-a447-8de1a42eec83 shift_date: type: string examples: - '2026-08-05' scheduled_start_time: type: string examples: - '11:58:00' scheduled_end_time: type: string examples: - '12:13:00' status: type: string examples: - checked_in attendance_status: type: string examples: - checked_in attendance_status_label: type: string examples: - Eingecheckt started_at: type: - string - 'null' examples: - null completed_at: type: - string - 'null' examples: - null is_no_show: type: boolean examples: - false no_show_reason: type: - string - 'null' examples: - null location_name: type: string examples: - 'Goldner and Sons' job: type: object properties: id: type: string examples: - 019fd2b8-28c4-732f-a94c-fb5a71a7d682 title: type: string examples: - Accountant employee: type: object properties: id: type: string examples: - 019fd2b7-f271-73fd-8268-848be381e136 name: type: string examples: - 'Anna Neuling' email: type: string examples: - pending@demo.flexxr.at phone: type: string examples: - '+436769876543' contract_signed_at: type: - string - 'null' examples: - null contract_in_force: type: boolean examples: - false hourly_rate_gross: type: string examples: - '18.57' examples: - - id: 019fd2b8-28d8-728d-a447-8de1a42eec83 shift_date: '2026-08-05' scheduled_start_time: '11:58:00' scheduled_end_time: '12:13:00' status: checked_in attendance_status: checked_in attendance_status_label: Eingecheckt started_at: null completed_at: null is_no_show: false no_show_reason: null location_name: 'Goldner and Sons' job: id: 019fd2b8-28c4-732f-a94c-fb5a71a7d682 title: Accountant employee: id: 019fd2b7-f271-73fd-8268-848be381e136 name: 'Anna Neuling' email: pending@demo.flexxr.at phone: '+436769876543' contract_signed_at: null contract_in_force: false hourly_rate_gross: '18.57' summary: type: object properties: total: type: integer examples: - 1 pending: type: integer examples: - 0 checked_in: type: integer examples: - 1 completed: type: integer examples: - 0 no_show: type: integer examples: - 0 meta: type: object properties: current_page: type: integer examples: - 1 last_page: type: integer examples: - 1 per_page: type: integer examples: - 50 total: type: integer examples: - 1 examples: - status: SUCCESS data: records: - id: 019fd2b8-28d8-728d-a447-8de1a42eec83 shift_date: '2026-08-05' scheduled_start_time: '11:58:00' scheduled_end_time: '12:13:00' status: checked_in attendance_status: checked_in attendance_status_label: Eingecheckt started_at: null completed_at: null is_no_show: false no_show_reason: null location_name: 'Goldner and Sons' job: id: 019fd2b8-28c4-732f-a94c-fb5a71a7d682 title: Accountant employee: id: 019fd2b7-f271-73fd-8268-848be381e136 name: 'Anna Neuling' email: pending@demo.flexxr.at phone: '+436769876543' contract_signed_at: null contract_in_force: false hourly_rate_gross: '18.57' summary: total: 1 pending: 0 checked_in: 1 completed: 0 no_show: 0 meta: current_page: 1 last_page: 1 per_page: 50 total: 1 tags: - 'Company - Attendance' /api/v1/org/auth/verify-email/confirm: post: summary: "Confirm a company's email ownership by consuming the verification link token\n(Szenario Unternehmen — \"E-Mail-Adresse (Verifizierung)\")." operationId: confirmACompanysEmailOwnershipByConsumingTheVerificationLinkTokenSzenarioUnternehmenEMailAdresseVerifizierung description: '' parameters: [] responses: { } tags: - 'Company - Auth' requestBody: required: true content: application/json: schema: type: object properties: email: type: string description: 'Email address from the verification link.' examples: - kontakt@firma.at token: type: string description: 'Verification token from the emailed link.' examples: - abc123def456... required: - email - token security: [] /api/v1/org/auth/verify-email/resend: post: summary: "Resend the company email-verification link. Always returns success to avoid\nleaking which addresses are registered." operationId: resendTheCompanyEmailVerificationLinkAlwaysReturnsSuccessToAvoidLeakingWhichAddressesAreRegistered description: '' parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS message: type: string examples: - 'If this address has a pending verification, a new link has been sent.' data: type: object properties: email: type: string examples: - kontakt@firma.at examples: - status: SUCCESS message: 'If this address has a pending verification, a new link has been sent.' data: email: kontakt@firma.at tags: - 'Company - Auth' requestBody: required: true content: application/json: schema: type: object properties: email: type: string description: 'Company email address.' examples: - kontakt@firma.at required: - email security: [] /api/v1/org/invoices: get: summary: 'List invoices for the authenticated organization.' operationId: listInvoicesForTheAuthenticatedOrganization description: '' parameters: - in: query name: status description: 'optional Filter by invoice status (draft, generated, sent, paid, overdue, cancelled, partially_paid).' required: false schema: type: string description: 'optional Filter by invoice status (draft, generated, sent, paid, overdue, cancelled, partially_paid).' examples: - paid - in: query name: year description: 'optional Filter by billing year.' required: false schema: type: integer description: 'optional Filter by billing year.' examples: - 2026 - in: query name: month description: 'optional Filter by billing month (1–12).' required: false schema: type: integer description: 'optional Filter by billing month (1–12).' examples: - 5 - in: query name: per_page description: 'optional Items per page (1–100, default 20).' required: false schema: type: integer description: 'optional Items per page (1–100, default 20).' examples: - 20 - in: query name: page description: 'optional Page number (default 1).' required: false schema: type: integer description: 'optional Page number (default 1).' examples: - 1 responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS data: type: object properties: invoices: type: array examples: - [] summary: type: object properties: total: type: integer examples: - 1 paid: type: integer examples: - 0 pending: type: integer examples: - 1 overdue: type: integer examples: - 0 total_paid_cents: type: integer examples: - 0 pagination: type: object properties: current_page: type: integer examples: - 1 last_page: type: integer examples: - 1 per_page: type: integer examples: - 20 total: type: integer examples: - 0 examples: - status: SUCCESS data: invoices: [] summary: total: 1 paid: 0 pending: 1 overdue: 0 total_paid_cents: 0 pagination: current_page: 1 last_page: 1 per_page: 20 total: 0 tags: - 'Company - Billing' '/api/v1/org/invoices/{invoiceId}': get: summary: 'Show a single invoice with line items.' operationId: showASingleInvoiceWithLineItems description: '' parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS data: type: object properties: invoice: type: object properties: id: type: string examples: - 3257a732-8d8a-4de5-8dee-a54e85c7e111 invoice_number: type: string examples: - RE-2026-055747 period: type: string examples: - 2026-08 status: type: string examples: - draft status_label: type: string examples: - Draft reference: type: - string - 'null' examples: - null notes: type: - string - 'null' examples: - null summary: type: object properties: subtotal_cents: type: integer examples: - 55952 vat_rate_percent: type: integer examples: - 20 vat_amount_cents: type: integer examples: - 11190 platform_fee_cents: type: integer examples: - 0 total_cents: type: integer examples: - 67142 paid_amount_cents: type: integer examples: - 0 dates: type: object properties: invoice_date: type: string examples: - '2026-08-05' due_date: type: string examples: - '2026-08-19' sent_at: type: - string - 'null' examples: - null paid_at: type: - string - 'null' examples: - null pdf_path: type: - string - 'null' examples: - null line_items: type: array examples: - [] examples: - status: SUCCESS data: invoice: id: 3257a732-8d8a-4de5-8dee-a54e85c7e111 invoice_number: RE-2026-055747 period: 2026-08 status: draft status_label: Draft reference: null notes: null summary: subtotal_cents: 55952 vat_rate_percent: 20 vat_amount_cents: 11190 platform_fee_cents: 0 total_cents: 67142 paid_amount_cents: 0 dates: invoice_date: '2026-08-05' due_date: '2026-08-19' sent_at: null paid_at: null pdf_path: null line_items: [] 404: description: 'Not Found' content: application/json: schema: type: object properties: status: type: string examples: - NOT_FOUND message: type: string examples: - 'Invoice not found.' examples: - status: NOT_FOUND message: 'Invoice not found.' tags: - 'Company - Billing' parameters: - in: path name: invoiceId description: 'The UUID of the invoice.' required: true schema: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 '/api/v1/org/jobs/{jobId}/cover-image': post: summary: "Upload the optional cover image for a job listing (\"Optional kann ein Bild\nhochgeladen werden\")." operationId: uploadTheOptionalCoverImageForAJobListingOptionalKannEinBildHochgeladenWerden description: '' parameters: [] responses: { } tags: - 'Company - Jobs' requestBody: required: true content: multipart/form-data: schema: type: object properties: image: type: string format: binary description: 'Job cover image (max 4MB).' required: - image parameters: - in: path name: jobId description: 'The UUID of the job.' required: true schema: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 '/api/v1/org/jobs/{jobId}/assignment-settings': patch: summary: 'Update assignment method and auto-reject settings for a job.' operationId: updateAssignmentMethodAndAutoRejectSettingsForAJob description: '' parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS message: type: string examples: - messages.assignment_settings_updated data: type: object properties: job_id: type: string examples: - 019fd2b8-28c4-732f-a94c-fb5a71a7d682 assignment_method: type: string examples: - manual auto_reject_after_hours: type: integer examples: - 1 examples: - status: SUCCESS message: messages.assignment_settings_updated data: job_id: 019fd2b8-28c4-732f-a94c-fb5a71a7d682 assignment_method: manual auto_reject_after_hours: 1 tags: - 'Company - Jobs' requestBody: required: true content: application/json: schema: type: object properties: assignment_method: type: string description: 'Allowed: manual, auto, first_come_first_served.' examples: - manual auto_reject_after_hours: type: integer description: '' examples: - 1 required: - assignment_method parameters: - in: path name: jobId description: '' required: true schema: type: string examples: - architecto '/api/v1/org/shifts/no-shows/{incidentId}/replacement-request': post: summary: 'Request emergency replacement for a no-show incident.' operationId: requestEmergencyReplacementForANoShowIncident description: "Allowed when the incident status is detected, confirmed, or disputed,\nand no replacement worker has been assigned yet.\nStatus transitions to `replacement_requested`." parameters: [] responses: 200: description: Success content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS message: type: string examples: - 'Replacement requested.' data: type: object properties: incident_id: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 status: type: string examples: - replacement_requested status_label: type: string examples: - 'Ersatz angefordert' replacement_requested_at: type: string examples: - '2026-05-10 08:15' examples: - status: SUCCESS message: 'Replacement requested.' data: incident_id: 550e8400-e29b-41d4-a716-446655440000 status: replacement_requested status_label: 'Ersatz angefordert' replacement_requested_at: '2026-05-10 08:15' 404: description: 'Incident Not Found' content: application/json: schema: type: object properties: status: type: string examples: - NOT_FOUND message: type: string examples: - 'No-show incident not found.' examples: - status: NOT_FOUND message: 'No-show incident not found.' 422: description: 'Not Allowed' content: application/json: schema: type: object properties: status: type: string examples: - INVALID_OPERATION message: type: string examples: - 'Replacement cannot be requested for this incident.' examples: - status: INVALID_OPERATION message: 'Replacement cannot be requested for this incident.' tags: - 'Company - No-Show' requestBody: required: false content: application/json: schema: type: object properties: reason: type: string description: 'optional nullable Reason for the replacement request (max 500 characters).' examples: - 'Dringender Ersatz benötigt - Standup beginnt in 30 Minuten.' parameters: - in: path name: incidentId description: 'The UUID of the no-show incident.' required: true schema: type: string examples: - 550e8400-e29b-41d4-a716-446655440000 /api/v1/org/shifts/no-shows: get: summary: 'List no-show incidents for the organization.' operationId: listNoShowIncidentsForTheOrganization description: '' parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS data: type: object properties: incidents: type: array examples: - [] summary: type: object properties: total: type: integer examples: - 0 unresolved: type: integer examples: - 0 excused: type: integer examples: - 0 with_replacement: type: integer examples: - 0 meta: type: object properties: current_page: type: integer examples: - 1 last_page: type: integer examples: - 1 per_page: type: integer examples: - 20 total: type: integer examples: - 0 examples: - status: SUCCESS data: incidents: [] summary: total: 0 unresolved: 0 excused: 0 with_replacement: 0 meta: current_page: 1 last_page: 1 per_page: 20 total: 0 tags: - 'Company - No-Shows' /api/v1/org/reports/summary: get: summary: 'Get workforce reports summary for the organization.' operationId: getWorkforceReportsSummaryForTheOrganization description: "Returns shift statistics, hours metrics, worker engagement,\nfinancial overview, no-show analysis, compliance violations,\nand top workers for the specified date range.\nDefaults to the current calendar month when no dates are provided." parameters: - in: query name: date_from description: 'optional Start of the report period (YYYY-MM-DD). Defaults to first day of current month.' required: false schema: type: string description: 'optional Start of the report period (YYYY-MM-DD). Defaults to first day of current month.' examples: - '2026-05-01' - in: query name: date_to description: 'optional End of the report period (YYYY-MM-DD). Defaults to last day of current month.' required: false schema: type: string description: 'optional End of the report period (YYYY-MM-DD). Defaults to last day of current month.' examples: - '2026-05-31' responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS data: type: object properties: period: type: object properties: date_from: type: string examples: - '2026-05-01' date_to: type: string examples: - '2026-05-31' kpis: type: object properties: fill_rate_percent: type: integer examples: - 0 total_hours: type: integer examples: - 0 monthly_cost_cents: type: integer examples: - 0 avg_hours_per_worker: type: integer examples: - 0 repeat_rate_percent: type: integer examples: - 0 attendance: type: object properties: pending: type: integer examples: - 0 checked_in: type: integer examples: - 0 completed: type: integer examples: - 0 no_show: type: integer examples: - 0 total: type: integer examples: - 0 no_shows: type: object properties: total: type: integer examples: - 0 excused: type: integer examples: - 0 unresolved: type: integer examples: - 0 with_replacement: type: integer examples: - 0 compliance: type: object properties: score: type: integer examples: - 100 critical_violations: type: integer examples: - 0 open_violations: type: integer examples: - 0 disputed_hours_entries: type: integer examples: - 0 examples: - status: SUCCESS data: period: date_from: '2026-05-01' date_to: '2026-05-31' kpis: fill_rate_percent: 0 total_hours: 0 monthly_cost_cents: 0 avg_hours_per_worker: 0 repeat_rate_percent: 0 attendance: pending: 0 checked_in: 0 completed: 0 no_show: 0 total: 0 no_shows: total: 0 excused: 0 unresolved: 0 with_replacement: 0 compliance: score: 100 critical_violations: 0 open_violations: 0 disputed_hours_entries: 0 tags: - 'Company - Reports' /api/v1/org/reports/compliance/export: get: summary: 'Export compliance report data for the organization.' operationId: exportComplianceReportDataForTheOrganization description: "Returns a structured JSON dataset containing per-shift compliance\ninformation (hours worked, breaks, no-show flags, AZG/ARG compliance).\nIntended for PDF/CSV export by the frontend.\nDefaults to the current calendar month when no dates are provided." parameters: - in: query name: date_from description: 'optional Start of the export period (YYYY-MM-DD). Defaults to first day of current month.' required: false schema: type: string description: 'optional Start of the export period (YYYY-MM-DD). Defaults to first day of current month.' examples: - '2026-05-01' - in: query name: date_to description: 'optional End of the export period (YYYY-MM-DD). Defaults to last day of current month.' required: false schema: type: string description: 'optional End of the export period (YYYY-MM-DD). Defaults to last day of current month.' examples: - '2026-05-31' responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS message: type: string examples: - 'Report export is ready.' data: type: object properties: filename: type: string examples: - compliance-report-2026-05-01-to-2026-05-31.csv mime_type: type: string examples: - 'text/csv; charset=UTF-8' csv: type: string examples: - "date,shift_id,job_title,employee_name,employee_email,scheduled_start,scheduled_end,worked_hours,break_minutes,no_show,no_show_status,attendance_dispute,azg_daily_hours_flag\n" rows: type: integer examples: - 0 period: type: object properties: date_from: type: string examples: - '2026-05-01' date_to: type: string examples: - '2026-05-31' examples: - status: SUCCESS message: 'Report export is ready.' data: filename: compliance-report-2026-05-01-to-2026-05-31.csv mime_type: 'text/csv; charset=UTF-8' csv: "date,shift_id,job_title,employee_name,employee_email,scheduled_start,scheduled_end,worked_hours,break_minutes,no_show,no_show_status,attendance_dispute,azg_daily_hours_flag\n" rows: 0 period: date_from: '2026-05-01' date_to: '2026-05-31' tags: - 'Company - Reports' /api/v1/org/shifts/scan-qr/resolve: post: summary: "Resolve step of the smart QR flow: decodes the scanned code and returns\nthe assignment's info + terms + the single currently-valid action\n(check_in, check_out, or blocked-with-reason). Read-only — never burns\nthe QR's single-use nonce and never mutates state. Whoever scans (worker\nself-service or shift manager) sees this before confirming." operationId: resolveStepOfTheSmartQRFlowDecodesTheScannedCodeAndReturnsTheAssignmentsInfo+Terms+TheSingleCurrentlyValidActioncheckInCheckOutOrBlockedWithReasonReadOnlyNeverBurnsTheQRsSingleUseNonceAndNeverMutatesStateWhoeverScansworkerSelfServiceOrShiftManagerSeesThisBeforeConfirming description: '' parameters: [] responses: { } tags: - 'Company - Shifts' requestBody: required: true content: application/json: schema: type: object properties: qr_payload: type: string description: "The encrypted QR payload from the employee's device." examples: - architecto required: - qr_payload /api/v1/org/shifts/scan-qr/confirm: post: summary: "Confirm step of the smart QR flow: burns the QR's 60-second single-use\nnonce and executes the freshly re-resolved smart action (check_in or\ncheck_out). The action is recomputed here, not trusted from the resolve\nresponse, so a state change between the two calls can't be bypassed." operationId: confirmStepOfTheSmartQRFlowBurnsTheQRs60SecondSingleUseNonceAndExecutesTheFreshlyReResolvedSmartActioncheckInOrCheckOutTheActionIsRecomputedHereNotTrustedFromTheResolveResponseSoAStateChangeBetweenTheTwoCallsCantBeBypassed description: '' parameters: [] responses: { } tags: - 'Company - Shifts' requestBody: required: true content: application/json: schema: type: object properties: qr_payload: type: string description: "The encrypted QR payload from the employee's device." examples: - architecto lat: type: - number - 'null' description: 'Optional GPS latitude of the scanning device.' examples: - 4326.41688 lng: type: - number - 'null' description: 'Optional GPS longitude of the scanning device.' examples: - 4326.41688 signature: type: - string - 'null' description: 'Optional worker signature captured on the device.' examples: - architecto required: - qr_payload '/api/v1/org/shifts/{shiftId}/signature-refused': post: summary: 'Organization reports that an employee refused to sign the shift time record.' operationId: organizationReportsThatAnEmployeeRefusedToSignTheShiftTimeRecord description: "Sets dispute_type = 'signature_refused' on the shift attendance." parameters: [] responses: { } tags: - 'Company - Shifts' requestBody: required: false content: application/json: schema: type: object properties: reason: type: string description: '' examples: - 'Krankheitsbedingt kurzfristig abgesagt.' parameters: - in: path name: shiftId description: '' required: true schema: type: string examples: - architecto '/api/v1/org/shifts/{shiftId}/assignments/{assignmentId}/check-in': post: summary: "Manager override: the shift manager (or an org admin/owner) checks a\nworker in directly, no QR needed — how a worker gets checked in past the\nself-service window. Replaces the old \"start the shift\" step: check-in IS\nclock-in, there is no separate start." operationId: managerOverrideTheShiftManagerorAnOrgAdminownerChecksAWorkerInDirectlyNoQRNeededHowAWorkerGetsCheckedInPastTheSelfServiceWindowReplacesTheOldstartTheShiftStepCheckInISClockInThereIsNoSeparateStart description: '' parameters: [] responses: { } tags: - 'Company - Shifts' requestBody: required: false content: application/json: schema: type: object properties: lat: type: integer description: '' examples: - 1 lng: type: integer description: '' examples: - 1 parameters: - in: path name: shiftId description: '' required: true schema: type: string examples: - architecto - in: path name: assignmentId description: '' required: true schema: type: string examples: - architecto '/api/v1/org/shifts/{shiftId}/early-checkout': post: summary: "Supervisor ends a worker's in-progress shift early (on-site initiated early\ncheckout — sickness, employer-ended, sent home, …). Records the reason and\ncategory and clocks the worker out." operationId: supervisorEndsAWorkersInProgressShiftEarlyonSiteInitiatedEarlyCheckoutSicknessEmployerEndedSentHomeRecordsTheReasonAndCategoryAndClocksTheWorkerOut description: '' parameters: [] responses: { } tags: - 'Company - Shifts' requestBody: required: true content: application/json: schema: type: object properties: reason: type: string description: 'Why the shift is ending early.' examples: - 'Mitarbeiter erkrankt, nach Hause geschickt.' category: type: string description: 'Allowed: sickness, injury, misconduct, left_workplace, employer_ended, other.' examples: - employer_ended required: - reason parameters: - in: path name: shiftId description: '' required: true schema: type: string examples: - architecto '/api/v1/org/shifts/{shiftId}/modify': post: summary: "Company modifies an upcoming assigned shift — its scheduled time and/or its\nlocation/meeting point — and the assigned worker is notified accordingly\n(\"Schicht geändert\" / \"Einsatzort geändert\")." operationId: companyModifiesAnUpcomingAssignedShiftItsScheduledTimeAndorItsLocationmeetingPointAndTheAssignedWorkerIsNotifiedAccordinglySchichtGendertEinsatzortGendert description: "Only allowed before the shift starts (pending confirmation, confirmed or\nscheduled)." parameters: [] responses: { } tags: - 'Company - Shifts' requestBody: required: false content: application/json: schema: type: object properties: shift_date: type: date description: 'New shift date (YYYY-MM-DD).' examples: - '2026-07-02' scheduled_start_time: type: string description: 'New start time (HH:MM).' examples: - '09:00' scheduled_end_time: type: string description: 'New end time (HH:MM).' examples: - '17:00' location_name: type: string description: 'New location display name.' examples: - 'Messe Wien Halle B' location_address: type: string description: 'New street address.' examples: - 'Messeplatz 1' location_lat: type: numeric description: 'New latitude.' examples: - '48.2208' location_lng: type: numeric description: 'New longitude.' examples: - '16.4108' reason: type: string description: 'Why the shift is being changed.' examples: - 'Halle wurde verlegt.' parameters: - in: path name: shiftId description: 'UUID of the shift.' required: true schema: type: string examples: - 9c3f5f3d-0123-4abc-b456-426614174000 /api/v1/org/shifts/pending-confirmation: get: summary: 'List shifts pending time confirmation.' operationId: listShiftsPendingTimeConfirmation description: '' parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS data: type: object properties: shifts: type: array items: type: object properties: id: type: string examples: - 019fd2b8-28df-7265-8b1e-cb5de026e4d7 job: type: object properties: id: type: string examples: - 019fd2b8-28c4-732f-a94c-fb5a71a7d682 title: type: string examples: - Accountant employee: type: object properties: id: type: string examples: - 019fd2b7-f271-73fd-8268-848be381e136 name: type: string examples: - 'Anna Neuling' lhr_synced: type: boolean examples: - false date: type: string examples: - '2026-08-03' planned_start: type: string examples: - '08:31' planned_end: type: string examples: - '05:12' actual_check_in: type: - string - 'null' examples: - null actual_check_out: type: - string - 'null' examples: - null worked_minutes: type: integer examples: - 0 break_minutes: type: integer examples: - 0 status: type: string examples: - completed dispute_reason: type: - string - 'null' examples: - null hourly_rate: type: number examples: - 18.25 gross_amount: type: integer examples: - 0 examples: - - id: 019fd2b8-28df-7265-8b1e-cb5de026e4d7 job: id: 019fd2b8-28c4-732f-a94c-fb5a71a7d682 title: Accountant employee: id: 019fd2b7-f271-73fd-8268-848be381e136 name: 'Anna Neuling' lhr_synced: false date: '2026-08-03' planned_start: '08:31' planned_end: '05:12' actual_check_in: null actual_check_out: null worked_minutes: 0 break_minutes: 0 status: completed dispute_reason: null hourly_rate: 18.25 gross_amount: 0 summary: type: object properties: total_shifts: type: integer examples: - 1 total_minutes: type: integer examples: - 0 total_gross: type: integer examples: - 0 pagination: type: object properties: current_page: type: integer examples: - 1 last_page: type: integer examples: - 1 per_page: type: integer examples: - 20 total: type: integer examples: - 1 examples: - status: SUCCESS data: shifts: - id: 019fd2b8-28df-7265-8b1e-cb5de026e4d7 job: id: 019fd2b8-28c4-732f-a94c-fb5a71a7d682 title: Accountant employee: id: 019fd2b7-f271-73fd-8268-848be381e136 name: 'Anna Neuling' lhr_synced: false date: '2026-08-03' planned_start: '08:31' planned_end: '05:12' actual_check_in: null actual_check_out: null worked_minutes: 0 break_minutes: 0 status: completed dispute_reason: null hourly_rate: 18.25 gross_amount: 0 summary: total_shifts: 1 total_minutes: 0 total_gross: 0 pagination: current_page: 1 last_page: 1 per_page: 20 total: 1 tags: - 'Company - Shifts' '/api/v1/org/shifts/{shiftId}/confirm': post: summary: 'Confirm shift worked time.' operationId: confirmShiftWorkedTime description: "When a company confirms the worked time, the payout process is triggered\nvia LHR (lohn.at). This is the critical step that initiates employee payment." parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS message: type: string examples: - 'Shift time confirmed, payout initiated.' data: type: object properties: shift_id: type: string examples: - 019fd2b8-a5fe-72da-bca5-e12ff2951c28 status: type: string examples: - hours_confirmed actual_minutes: type: integer examples: - 480 gross_amount: type: number examples: - 263.36 payout_queued: type: boolean examples: - true examples: - status: SUCCESS message: 'Shift time confirmed, payout initiated.' data: shift_id: 019fd2b8-a5fe-72da-bca5-e12ff2951c28 status: hours_confirmed actual_minutes: 480 gross_amount: 263.36 payout_queued: true 422: description: 'Open requests on the shift' content: application/json: schema: type: object properties: status: type: string examples: - INVALID_OPERATION message: type: string examples: - 'Diese Schicht hat noch offene Anfragen. Bitte zuerst alle Anfragen entscheiden.' data: type: object properties: pending_requests: type: array items: type: object properties: id: type: string examples: - 019f9939-c4c3-70fb-a54e-5ebf63db36d2 type: type: string examples: - overtime type_label: type: string examples: - Überstunden examples: - - id: 019f9939-c4c3-70fb-a54e-5ebf63db36d2 type: overtime type_label: Überstunden examples: - status: INVALID_OPERATION message: 'Diese Schicht hat noch offene Anfragen. Bitte zuerst alle Anfragen entscheiden.' data: pending_requests: - id: 019f9939-c4c3-70fb-a54e-5ebf63db36d2 type: overtime type_label: Überstunden tags: - 'Company - Shifts' requestBody: required: false content: application/json: schema: type: object properties: actual_minutes: type: integer description: '' examples: - 1 break_minutes: type: integer description: '' examples: - 1 note: type: string description: '' examples: - Beispieltext parameters: - in: path name: shiftId description: '' required: true schema: type: string examples: - architecto '/api/v1/org/shifts/{shiftId}/dispute': post: summary: 'Dispute shift worked time.' operationId: disputeShiftWorkedTime description: "When a company disputes the worked time, the payout is held pending resolution.\nThe dispute must be resolved before the employee can be paid." parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS message: type: string examples: - 'The shift time has been disputed.' data: type: object properties: shift_id: type: string examples: - 019fd2b8-a9b8-7256-a83d-365a8c7761c8 status: type: string examples: - disputed reason: type: string examples: - 'Die erfasste Zeit weicht von unserer Aufzeichnung ab.' examples: - status: SUCCESS message: 'The shift time has been disputed.' data: shift_id: 019fd2b8-a9b8-7256-a83d-365a8c7761c8 status: disputed reason: 'Die erfasste Zeit weicht von unserer Aufzeichnung ab.' tags: - 'Company - Shifts' requestBody: required: true content: application/json: schema: type: object properties: reason: type: string description: '' examples: - 'Krankheitsbedingt kurzfristig abgesagt.' disputed_minutes: type: integer description: '' examples: - 1 required: - reason parameters: - in: path name: shiftId description: '' required: true schema: type: string examples: - architecto /api/v1/org/wallet: get: summary: "Returns the authenticated organization's wallet summary, auto-creating\nthe wallet row on first access via {@see WalletService::walletFor()}." operationId: returnsTheAuthenticatedOrganizationsWalletSummaryAutoCreatingTheWalletRowOnFirstAccessViaseeWalletServicewalletFor description: '' parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS data: type: object properties: balance_cents: type: integer examples: - 250000 blocked_cents: type: integer examples: - 0 available_cents: type: integer examples: - 250000 currency: type: string examples: - EUR has_payment_method: type: boolean examples: - false withdrawable_cents: type: integer examples: - 0 examples: - status: SUCCESS data: balance_cents: 250000 blocked_cents: 0 available_cents: 250000 currency: EUR has_payment_method: false withdrawable_cents: 0 tags: - 'Company - Wallet' /api/v1/org/wallet/transactions: get: summary: "Paginated wallet ledger, newest first. Auto-creates the wallet via\n{@see WalletService::walletFor()} so a fresh organization sees an empty\nlist instead of a 404." operationId: paginatedWalletLedgerNewestFirstAutoCreatesTheWalletViaseeWalletServicewalletForSoAFreshOrganizationSeesAnEmptyListInsteadOfA404 description: '' parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS data: type: object properties: transactions: type: array items: type: object properties: id: type: string examples: - 019fd2b8-c69e-714a-8069-e4d9c2c222ac type: type: string examples: - topup type_label: type: string examples: - Aufladung amount_cents: type: integer examples: - 250000 balance_after_cents: type: integer examples: - 250000 blocked_after_cents: type: integer examples: - 0 description: type: string examples: - 'Guthaben für den Testlauf' reference_type: type: - string - 'null' examples: - null created_at: type: string examples: - '2026-08-05T16:19:12+00:00' examples: - - id: 019fd2b8-c69e-714a-8069-e4d9c2c222ac type: topup type_label: Aufladung amount_cents: 250000 balance_after_cents: 250000 blocked_after_cents: 0 description: 'Guthaben für den Testlauf' reference_type: null created_at: '2026-08-05T16:19:12+00:00' pagination: type: object properties: current_page: type: integer examples: - 1 last_page: type: integer examples: - 1 per_page: type: integer examples: - 20 total: type: integer examples: - 1 examples: - status: SUCCESS data: transactions: - id: 019fd2b8-c69e-714a-8069-e4d9c2c222ac type: topup type_label: Aufladung amount_cents: 250000 balance_after_cents: 250000 blocked_after_cents: 0 description: 'Guthaben für den Testlauf' reference_type: null created_at: '2026-08-05T16:19:12+00:00' pagination: current_page: 1 last_page: 1 per_page: 20 total: 1 tags: - 'Company - Wallet' /api/v1/org/wallet/topup-options: get: summary: "Admin-configured top-up amounts with their fee preview, so the portal can\nrender top-up buttons without duplicating the fee formula client-side." operationId: adminConfiguredTopUpAmountsWithTheirFeePreviewSoThePortalCanRenderTopUpButtonsWithoutDuplicatingTheFeeFormulaClientSide description: '' parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS data: type: object properties: options: type: array items: type: object properties: amount_cents: type: integer examples: - 100000 platform_fee_cents: type: integer examples: - 0 stripe_fee_cents: type: integer examples: - 1525 vat_cents: type: integer examples: - 0 total_charged_cents: type: integer examples: - 101525 examples: - - amount_cents: 100000 platform_fee_cents: 0 stripe_fee_cents: 1525 vat_cents: 0 total_charged_cents: 101525 - amount_cents: 200000 platform_fee_cents: 0 stripe_fee_cents: 3025 vat_cents: 0 total_charged_cents: 203025 - amount_cents: 500000 platform_fee_cents: 0 stripe_fee_cents: 7525 vat_cents: 0 total_charged_cents: 507525 examples: - status: SUCCESS data: options: - amount_cents: 100000 platform_fee_cents: 0 stripe_fee_cents: 1525 vat_cents: 0 total_charged_cents: 101525 - amount_cents: 200000 platform_fee_cents: 0 stripe_fee_cents: 3025 vat_cents: 0 total_charged_cents: 203025 - amount_cents: 500000 platform_fee_cents: 0 stripe_fee_cents: 7525 vat_cents: 0 total_charged_cents: 507525 tags: - 'Company - Wallet' /api/v1/org/wallet/topup: post: summary: "Creates a pending WalletTopup for one of the admin-configured amounts and,\nwhen Stripe is configured, opens a hosted Checkout Session for it. The\nwallet is only credited later — by App\\Http\\Controllers\\StripeWebhookController\nonce `checkout.session.completed` confirms payment." operationId: createsAPendingWalletTopupForOneOfTheAdminConfiguredAmountsAndWhenStripeIsConfiguredOpensAHostedCheckoutSessionForItTheWalletIsOnlyCreditedLaterByAppHttpControllersStripeWebhookControllerOncecheckoutsessioncompletedConfirmsPayment description: '' parameters: [] responses: { } tags: - 'Company - Wallet' requestBody: required: true content: application/json: schema: type: object properties: amount_cents: type: integer description: '' examples: - 1 required: - amount_cents /api/v1/org/wallet/topup/confirm: post: summary: "POST /org/wallet/topup/confirm — settle a top-up right on the checkout\nreturn instead of waiting for the async webhook. Looks the top-up up by its\ncheckout session id (scoped to the caller's organisation), asks Stripe for\nthe session's real state and settles it if paid. Idempotent: the shared\nsettle path means a later webhook or the reconcile cron can never\ndouble-credit." operationId: pOSTorgwallettopupconfirmSettleATopUpRightOnTheCheckoutReturnInsteadOfWaitingForTheAsyncWebhookLooksTheTopUpUpByItsCheckoutSessionIdscopedToTheCallersOrganisationAsksStripeForTheSessionsRealStateAndSettlesItIfPaidIdempotentTheSharedSettlePathMeansALaterWebhookOrTheReconcileCronCanNeverDoubleCredit description: '' parameters: [] responses: { } tags: - 'Company - Wallet' requestBody: required: true content: application/json: schema: type: object properties: session_id: type: string description: '' examples: - Beispieltext required: - session_id /api/v1/org/wallet/topup/cancel: post: summary: "POST /org/wallet/topup/cancel — close a top-up the instant the user returns\nfrom an abandoned checkout, instead of leaving it pending until the session\nexpires. Safety-first: if Stripe says the session was in fact paid (e.g. the\nuser paid in another tab then hit back), it's settled rather than failed." operationId: pOSTorgwallettopupcancelCloseATopUpTheInstantTheUserReturnsFromAnAbandonedCheckoutInsteadOfLeavingItPendingUntilTheSessionExpiresSafetyFirstIfStripeSaysTheSessionWasInFactPaidegTheUserPaidInAnotherTabThenHitBackItsSettledRatherThanFailed description: '' parameters: [] responses: { } tags: - 'Company - Wallet' requestBody: required: true content: application/json: schema: type: object properties: session_id: type: string description: '' examples: - Beispieltext required: - session_id /api/v1/org/wallet/topups: get: summary: "Paginated top-up history, newest first, with the fee breakdown and\nwhether a receipt PDF is available for download." operationId: paginatedTopUpHistoryNewestFirstWithTheFeeBreakdownAndWhetherAReceiptPDFIsAvailableForDownload description: '' parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS data: type: object properties: topups: type: array examples: - [] pagination: type: object properties: current_page: type: integer examples: - 1 last_page: type: integer examples: - 1 per_page: type: integer examples: - 20 total: type: integer examples: - 0 examples: - status: SUCCESS data: topups: [] pagination: current_page: 1 last_page: 1 per_page: 20 total: 0 tags: - 'Company - Wallet' '/api/v1/org/wallet/topups/{topupId}/receipt': get: summary: "Streams the receipt PDF for a succeeded top-up. Guarded at the route by\nthe `invoices.download` ACL ability (see App\\Providers\\AclServiceProvider)\non top of the org-member auth/2FA/approved guard, and here by ownership +\nthe topup actually having a stored receipt." operationId: streamsTheReceiptPDFForASucceededTopUpGuardedAtTheRouteByTheinvoicesdownloadACLAbilityseeAppProvidersAclServiceProviderOnTopOfTheOrgMemberAuth2FAapprovedGuardAndHereByOwnership+TheTopupActuallyHavingAStoredReceipt description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object properties: status: type: string examples: - ERROR message: type: string examples: - 'Service Unavailable' data: type: - string - 'null' examples: - null errors: type: array items: type: object properties: field: type: - string - 'null' examples: - null message: type: string examples: - 'Service Unavailable' examples: - - field: null message: 'Service Unavailable' meta: type: object properties: request_id: type: string examples: - cecb0139-a407-44f0-afa8-04001609da18 timestamp: type: string examples: - '2026-08-21T05:14:35.364603Z' examples: - status: ERROR message: 'Service Unavailable' data: null errors: - field: null message: 'Service Unavailable' meta: request_id: cecb0139-a407-44f0-afa8-04001609da18 timestamp: '2026-08-21T05:14:35.364603Z' tags: - 'Company - Wallet' parameters: - in: path name: topupId description: '' required: true schema: type: string examples: - architecto /api/v1/org/wallet/withdraw: post: summary: "POST /org/wallet/withdraw — return available wallet balance to the card that\nfunded it (Stripe refund). Amounts up to the auto-approval threshold complete\ninstantly; larger ones come back `pending` for an admin to approve." operationId: pOSTorgwalletwithdrawReturnAvailableWalletBalanceToTheCardThatFundedItStripeRefundAmountsUpToTheAutoApprovalThresholdCompleteInstantlyLargerOnesComeBackpendingForAnAdminToApprove description: '' parameters: [] responses: { } tags: - 'Company - Wallet' requestBody: required: true content: application/json: schema: type: object properties: amount_cents: type: integer description: '' examples: - 1 required: - amount_cents /api/v1/org/wallet/withdrawals: get: summary: "GET /org/wallet/withdrawals — the company's withdrawal history, newest first." operationId: gETorgwalletwithdrawalsTheCompanysWithdrawalHistoryNewestFirst description: '' parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS data: type: object properties: withdrawals: type: array examples: - [] pagination: type: object properties: current_page: type: integer examples: - 1 last_page: type: integer examples: - 1 per_page: type: integer examples: - 20 total: type: integer examples: - 0 examples: - status: SUCCESS data: withdrawals: [] pagination: current_page: 1 last_page: 1 per_page: 20 total: 0 tags: - 'Company - Wallet' '/api/v1/org/wallet/withdrawals/{withdrawalId}/cancel': post: summary: "POST /org/wallet/withdrawals/{withdrawalId}/cancel — a company withdraws its\nown still-pending (over-threshold, awaiting-admin-review) withdrawal request\nbefore it's reviewed, releasing the reserved funds back to its available\nbalance immediately." operationId: pOSTorgwalletwithdrawalswithdrawalIdcancelACompanyWithdrawsItsOwnStillPendingoverThresholdAwaitingAdminReviewWithdrawalRequestBeforeItsReviewedReleasingTheReservedFundsBackToItsAvailableBalanceImmediately description: '' parameters: [] responses: { } tags: - 'Company - Wallet' parameters: - in: path name: withdrawalId description: '' required: true schema: type: string examples: - architecto '/api/v1/mobile/shifts/{shiftId}/time-record': get: summary: 'Download / retrieve a shift time record summary for the authenticated employee.' operationId: downloadRetrieveAShiftTimeRecordSummaryForTheAuthenticatedEmployee description: 'Returns worked hours, break time, and a gross earnings estimate for the shift.' parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS data: type: object properties: shift_id: type: string examples: - 019fd4e7-ff04-72e4-a010-3ff64e0d3e8f shift_date: type: string examples: - '2026-08-06' scheduled_start_time: type: string examples: - '02:30:00' scheduled_end_time: type: string examples: - '10:30:00' clock_in_at: type: string examples: - '2026-08-06T02:30:01+00:00' clock_out_at: type: string examples: - '2026-08-06T10:30:01+00:00' total_hours_worked: type: integer examples: - 8 break_minutes: type: integer examples: - 480 net_hours_worked: type: integer examples: - 0 hourly_rate: type: number examples: - 22.64 gross_amount: type: integer examples: - 0 dispute_type: type: - string - 'null' examples: - null examples: - status: SUCCESS data: shift_id: 019fd4e7-ff04-72e4-a010-3ff64e0d3e8f shift_date: '2026-08-06' scheduled_start_time: '02:30:00' scheduled_end_time: '10:30:00' clock_in_at: '2026-08-06T02:30:01+00:00' clock_out_at: '2026-08-06T10:30:01+00:00' total_hours_worked: 8 break_minutes: 480 net_hours_worked: 0 hourly_rate: 22.64 gross_amount: 0 dispute_type: null tags: - 'Employee - Shifts' parameters: - in: path name: shiftId description: '' required: true schema: type: string examples: - architecto /api/v1/mobile/wallet: get: summary: "Get the authenticated employee's wallet summary." operationId: getTheAuthenticatedEmployeesWalletSummary description: "Aggregates earnings from completed/confirmed shifts, separating\npending and paid amounts." parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS data: type: object properties: total_earned_gross: type: integer examples: - 0 pending_payout_gross: type: integer examples: - 0 processing_payout_gross: type: integer examples: - 0 paid_gross: type: integer examples: - 0 shifts_completed: type: integer examples: - 2 shifts_pending_payment: type: integer examples: - 2 pending_payments: type: array items: type: object properties: shift_id: type: string examples: - 019fd3d3-f998-72c7-affb-87f0986474d4 shift_date: type: string examples: - '2026-08-03' job_title: type: string examples: - 'Communications Teacher' organization_name: type: string examples: - Caritas gross_amount: type: integer examples: - 0 payment_status: type: string examples: - pending expected_payout_by: type: string examples: - '2026-08-17' examples: - - shift_id: 019fd3d3-f998-72c7-affb-87f0986474d4 shift_date: '2026-08-03' job_title: 'Communications Teacher' organization_name: Caritas gross_amount: 0 payment_status: pending expected_payout_by: '2026-08-17' - shift_id: 019fd3d3-f98a-70d2-83d5-eba7cae30f9a shift_date: '2026-08-06' job_title: 'Communications Teacher' organization_name: Caritas gross_amount: 0 payment_status: pending expected_payout_by: '2026-08-20' recent_payments: type: array examples: - [] examples: - status: SUCCESS data: total_earned_gross: 0 pending_payout_gross: 0 processing_payout_gross: 0 paid_gross: 0 shifts_completed: 2 shifts_pending_payment: 2 pending_payments: - shift_id: 019fd3d3-f998-72c7-affb-87f0986474d4 shift_date: '2026-08-03' job_title: 'Communications Teacher' organization_name: Caritas gross_amount: 0 payment_status: pending expected_payout_by: '2026-08-17' - shift_id: 019fd3d3-f98a-70d2-83d5-eba7cae30f9a shift_date: '2026-08-06' job_title: 'Communications Teacher' organization_name: Caritas gross_amount: 0 payment_status: pending expected_payout_by: '2026-08-20' recent_payments: [] tags: - 'Employee - Wallet' /api/v1/mobile/wallet/payments: get: summary: "Paginated payment history for the authenticated worker — the full ledger of\npaid shifts, beyond the last-5 preview surfaced on the wallet summary." operationId: paginatedPaymentHistoryForTheAuthenticatedWorkerTheFullLedgerOfPaidShiftsBeyondTheLast5PreviewSurfacedOnTheWalletSummary description: '' parameters: - in: query name: status description: 'Filter by payment status: paid|processing|pending.' required: false schema: type: string description: 'Filter by payment status: paid|processing|pending.' examples: - paid - in: query name: per_page description: 'Items per page (1-100, default 20).' required: false schema: type: integer description: 'Items per page (1-100, default 20).' examples: - 20 - in: query name: page description: 'Page number.' required: false schema: type: integer description: 'Page number.' examples: - 1 responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS data: type: array examples: - [] meta: type: object properties: current_page: type: integer examples: - 1 last_page: type: integer examples: - 1 per_page: type: integer examples: - 20 total: type: integer examples: - 0 examples: - status: SUCCESS data: [] meta: current_page: 1 last_page: 1 per_page: 20 total: 0 tags: - 'Employee - Wallet' /api/v1/mobile/wallet/payslip: get: summary: "Stream the authenticated worker's legally binding monthly Lohnzettel\n(Gehaltszettel) for a given period from lohn.at. Distinct from the per-shift\nVerdienstabrechnung — this is the official monthly payslip." operationId: streamTheAuthenticatedWorkersLegallyBindingMonthlyLohnzettelGehaltszettelForAGivenPeriodFromLohnatDistinctFromThePerShiftVerdienstabrechnungThisIsTheOfficialMonthlyPayslip description: '' parameters: - in: query name: period description: 'The payroll period in YYYY-MM format.' required: true schema: type: string description: 'The payroll period in YYYY-MM format.' examples: - 2026-05 responses: 200: description: '' content: text/plain: schema: type: string examples: - 'PDF file download' tags: - 'Employee - Wallet' requestBody: required: true content: application/json: schema: type: object properties: period: type: string description: 'Must match the regex /^\d{4}-\d{2}$/.' examples: - 6425-59 required: - period /api/v1/mobile/education: get: summary: "List the authenticated employee's education (Ausbildung) records." operationId: listTheAuthenticatedEmployeesEducationAusbildungRecords description: '' parameters: [] responses: 200: description: 'Recorded from a live call' content: application/json: schema: type: object properties: status: type: string examples: - SUCCESS data: type: object properties: education: type: array examples: - [] examples: - status: SUCCESS data: education: [] tags: - 'Mobile - Profile' post: summary: 'Add an education (Ausbildung) record for the authenticated employee.' operationId: addAnEducationAusbildungRecordForTheAuthenticatedEmployee description: '' parameters: [] responses: { } tags: - 'Mobile - Profile' requestBody: required: true content: application/json: schema: type: object properties: institution: type: string description: 'Name of the school/university.' examples: - 'HTL Wien' degree: type: string description: 'Degree or certificate.' examples: - Matura field_of_study: type: string description: '' examples: - Elektrotechnik level: type: string description: Lehre/Matura/Bachelor/Master/... examples: - Matura start_year: type: integer description: '' examples: - 2008 end_year: type: integer description: '' examples: - 2013 is_completed: type: boolean description: '' examples: - true document_id: type: string description: 'Optional linked uploaded document UUID.' examples: - architecto required: - institution '/api/v1/mobile/education/{educationId}': put: summary: "Update one of the authenticated employee's education records." operationId: updateOneOfTheAuthenticatedEmployeesEducationRecords description: '' parameters: [] responses: { } tags: - 'Mobile - Profile' requestBody: required: false content: application/json: schema: type: object properties: institution: type: string description: '' examples: - Beispieltext degree: type: string description: '' examples: - Beispieltext field_of_study: type: string description: '' examples: - Beispieltext level: type: string description: '' examples: - Beispieltext start_year: type: integer description: '' examples: - 1 end_year: type: integer description: '' examples: - 1 is_completed: type: boolean description: '' examples: - true delete: summary: "Delete one of the authenticated employee's education records." operationId: deleteOneOfTheAuthenticatedEmployeesEducationRecords description: '' parameters: [] responses: { } tags: - 'Mobile - Profile' parameters: - in: path name: educationId description: '' required: true schema: type: string examples: - architecto