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: - "

Arbeitskraft

\n

{worker_name}, geboren am {worker_birth_date}, {worker_address}

\n

Beschäftiger

\n

{organization_name}, {organization_address}

\n

Überlassung

\n

Tätigkeit: {job_title}
Einsatzort: {location}
Zeitraum: {start_date} – {end_date}
Entgelt (brutto/Std.): {hourly_rate}
Kollektivvertrag: {collective_agreement}

\n

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: "

Arbeitskraft

\n

{worker_name}, geboren am {worker_birth_date}, {worker_address}

\n

Beschäftiger

\n

{organization_name}, {organization_address}

\n

Überlassung

\n

Tätigkeit: {job_title}
Einsatzort: {location}
Zeitraum: {start_date} – {end_date}
Entgelt (brutto/Std.): {hourly_rate}
Kollektivvertrag: {collective_agreement}

\n

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: - "

Arbeitskraft

\n

{worker_name}, geboren am {worker_birth_date}, {worker_address}

\n

Beschäftiger

\n

{organization_name}, {organization_address}

\n

Überlassung

\n

Tätigkeit: {job_title}
Einsatzort: {location}
Zeitraum: {start_date} – {end_date}
Entgelt (brutto/Std.): {hourly_rate}
Kollektivvertrag: {collective_agreement}

\n

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: "

Arbeitskraft

\n

{worker_name}, geboren am {worker_birth_date}, {worker_address}

\n

Beschäftiger

\n

{organization_name}, {organization_address}

\n

Überlassung

\n

Tätigkeit: {job_title}
Einsatzort: {location}
Zeitraum: {start_date} – {end_date}
Entgelt (brutto/Std.): {hourly_rate}
Kollektivvertrag: {collective_agreement}

\n

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: - "

Arbeitskraft

\n

{worker_name}, geboren am {worker_birth_date}, {worker_address}

\n

Beschäftiger

\n

{organization_name}, {organization_address}

\n

Überlassung

\n

Tätigkeit: {job_title}
Einsatzort: {location}
Zeitraum: {start_date} – {end_date}
Entgelt (brutto/Std.): {hourly_rate}
Kollektivvertrag: {collective_agreement}

\n

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: "

Arbeitskraft

\n

{worker_name}, geboren am {worker_birth_date}, {worker_address}

\n

Beschäftiger

\n

{organization_name}, {organization_address}

\n

Überlassung

\n

Tätigkeit: {job_title}
Einsatzort: {location}
Zeitraum: {start_date} – {end_date}
Entgelt (brutto/Std.): {hourly_rate}
Kollektivvertrag: {collective_agreement}

\n

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: - "

Arbeitskraft

\n

{worker_name}, geboren am {worker_birth_date}, {worker_address}

\n

Beschäftiger

\n

{organization_name}, {organization_address}

\n

Überlassung

\n

Tätigkeit: {job_title}
Einsatzort: {location}
Zeitraum: {start_date} – {end_date}
Entgelt (brutto/Std.): {hourly_rate}
Kollektivvertrag: {collective_agreement}

\n

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: "

Arbeitskraft

\n

{worker_name}, geboren am {worker_birth_date}, {worker_address}

\n

Beschäftiger

\n

{organization_name}, {organization_address}

\n

Überlassung

\n

Tätigkeit: {job_title}
Einsatzort: {location}
Zeitraum: {start_date} – {end_date}
Entgelt (brutto/Std.): {hourly_rate}
Kollektivvertrag: {collective_agreement}

\n

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 to from.' 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: - "

Arbeitskraft

\n

{worker_name}, geboren am {worker_birth_date}, {worker_address}

\n

Beschäftiger

\n

{organization_name}, {organization_address}

\n

Überlassung

\n

Tätigkeit: {job_title}
Einsatzort: {location}
Zeitraum: {start_date} – {end_date}
Entgelt (brutto/Std.): {hourly_rate}
Kollektivvertrag: {collective_agreement}

\n

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: "

Arbeitskraft

\n

{worker_name}, geboren am {worker_birth_date}, {worker_address}

\n

Beschäftiger

\n

{organization_name}, {organization_address}

\n

Überlassung

\n

Tätigkeit: {job_title}
Einsatzort: {location}
Zeitraum: {start_date} – {end_date}
Entgelt (brutto/Std.): {hourly_rate}
Kollektivvertrag: {collective_agreement}

\n

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