Download OpenAPI specification:
Offizielle REST-API von wohnrechner.online (W.O. wohnrechner.online GmbH).
Authentifizierung: Bearer Token (per POST /api/v1/login zu erzeugen).
Authentifizierungs-Endpunkte: Login (Token-Erzeugung über Laravel Sanctum), Logout (Widerruf des aktuellen Tokens) und vollständiger Session-Reset (Token-Widerruf inkl. Beendigung der Web-Session).
Wird nicht benötigt, wenn ein API-Token über https://office.wohnrechner.online/api-tokens erstellt wurde.
Authentifiziert einen Benutzer mit Benutzername/E-Mail und Passwort und gibt ein Sanctum-API-Token zurück, das für alle geschützten Endpunkte als Bearer-Token gesendet wird.
Authentifizierung: Keine (öffentlicher Endpunkt).
Body-Parameter (JSON):
name (string, required) — Benutzername oder E-Mail-Adresse des Benutzers.password (string, required) — Passwort des Benutzers im Klartext.device_name (string, required) — Bezeichner des aufrufenden Gerätes/der Anwendung (z. B. iPhone-App oder WohnScanner-Mobile). Wird als Token-Name gespeichert und ermöglicht das gezielte Widerrufen einzelner Tokens.Response: JSON mit dem generierten Token (token) und Benutzerinformationen.
| name | string Example: name={{api_user}} |
| password | string Example: password={{api_password}} |
| device_name | string Example: device_name=postman |
| Content-Type | string Example: application/json Laravel akzeptiert application/json (auch wenn Postman-Mode formdata ist) |
| Accept | string Example: application/json Erzwingt JSON-Response |
| user_id | integer |
| token | string |
{- "user_id": 1234,
- "token": "1|abcdef0123456789xyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
}Widerruft das aktuelle Sanctum-Token UND beendet zusätzlich die Web-Session des Benutzers (vollständiger Logout über alle Kanäle). Wird genutzt, wenn der Benutzer sich aktiv komplett ausloggen möchte.
Authentifizierung: Bearer Token (Laravel Sanctum) erforderlich.
Body: Keine Parameter erforderlich.
Response: HTTP 204 / Success-Bestätigung.
| Accept | string Example: application/json Erzwingt JSON-Response |
| message | string |
{- "message": "Logged out successfully"
}Widerruft das aktuell verwendete Sanctum-API-Token, sodass es für weitere Requests nicht mehr gültig ist. Andere Tokens (z. B. auf anderen Geräten) bleiben bestehen.
Authentifizierung: Bearer Token (Laravel Sanctum) erforderlich.
Body: Keine Parameter erforderlich.
Response: HTTP 204 / Success-Bestätigung.
| Accept | string Example: application/json Erzwingt JSON-Response |
| message | string |
{- "message": "Logged out successfully"
}Endpunkte rund um den authentifizierten Benutzer: Stammdaten, zugewiesene Rollen, Session-Validierung und Logout über den UserApiController.
Liefert detaillierte Stammdaten des aktuell authentifizierten Benutzers (Name, E-Mail, Organisations-Zugehörigkeit, etc.).
Authentifizierung: Bearer Token (Laravel Sanctum) erforderlich.
Parameter: Keine.
Response: JSON mit den Benutzer-Detaildaten.
| Accept | string Example: application/json Erzwingt JSON-Response |
| name | string |
| salutation | string |
| first_name | string |
| last_name | string |
string | |
| telephone | string |
| customer_id | integer |
| customer_type | string |
| customer_number | string |
| customer_company | string |
| customer_salutation | string |
| customer_first_name | string |
| customer_last_name | string |
| customer_address | string |
| customer_zip | string |
| customer_city | string |
| customer_telephone | string |
| customer_email | string |
{- "name": "max.mustermann",
- "salutation": "Herr",
- "first_name": "Max",
- "last_name": "Mustermann",
- "email": "max@example.com",
- "telephone": "+49 30 12345678",
- "customer_id": 101,
- "customer_type": "private",
- "customer_number": "K-10042",
- "customer_company": "",
- "customer_salutation": "Herr",
- "customer_first_name": "Max",
- "customer_last_name": "Mustermann",
- "customer_address": "Musterstraße 1",
- "customer_zip": "10115",
- "customer_city": "Berlin",
- "customer_telephone": "+49 30 12345678",
- "customer_email": "max@example.com"
}Liefert alle dem authentifizierten Benutzer zugewiesenen Rollen (über Spatie Laravel Permission verwaltet).
Authentifizierung: Bearer Token (Laravel Sanctum) erforderlich.
Parameter: Keine.
Response: JSON-Array mit den Rollennamen des Benutzers.
| Accept | string Example: application/json Erzwingt JSON-Response |
[- "AppUser",
- "Customer"
]Prüft, ob das verwendete Bearer-Token noch gültig ist (Session-Validierung). Wird vom Client periodisch aufgerufen, um zu erkennen, ob der Benutzer noch eingeloggt ist.
Authentifizierung: Bearer Token (Laravel Sanctum) erforderlich.
Parameter: Keine.
Response: HTTP 200 bei gültiger Session, sonst HTTP 401.
| Accept | string Example: application/json Erzwingt JSON-Response |
trueLogout-Endpoint, der über den UserApiController bereitgestellt wird. Funktional identisch mit auth.revoke (POST /v1/logout) — widerruft das aktuell verwendete Sanctum-API-Token.
Authentifizierung: Bearer Token (Laravel Sanctum) erforderlich.
Parameter: Keine.
Response: HTTP 200 / Success-Bestätigung.
| Accept | string Example: application/json Erzwingt JSON-Response |
| message | string |
{- "message": "Logged out successfully"
}Verwaltung der Immobilien-Projekte des Benutzers — Anlegen, Lesen, Aktualisieren von Adress- und Objektdaten, Teilen innerhalb der Organisation und Erzeugung einer signierten Order-URL für den Bestellprozess.
Liefert alle Projekte des authentifizierten Benutzers. Enthält drei Quellen:
user_id = eingeloggter Benutzer.shared = true, deren Eigentümer denselben customer_id haben wie der aufrufende Benutzer.assigned_to) und den Status OPEN, DELEGATED oder CORRECTION hat. Wird intern über getAdditionalProjects() ermittelt und mit den obigen zusammengeführt (deduped über id). Ist im Code als "muss später entfernt werden" markiert.Authentifizierung: Bearer Token (Laravel Sanctum) erforderlich.
Parameter: Keine.
Response (200): JSON-Array von ProjectEntryResource-Objekten mit folgenden Feldern:
id (integer)created / created_at — ISO-8601 und Laravel-Timestamp der Erstellung.updated / updated_at — dieselben für das letzte Update.type (string) — ObjectTypeEnum-Wert ("0" bis "20", siehe createUserProject).address, zip, city, country (string) — mit deutschen Fallback-Strings wenn null ("Keine Adresse", "Keine Postleitzahl", "Kein Ort", "").custom_number (string, nullable) — freie Kundennummer/Referenz.shared (boolean) — ob mit dem Customer geteilt.Verwandte Endpoints:
project.getUserArchivedProjects — dieselbe Response-Shape für soft-deleted Projekte.project.getUserProject — Detailansicht mit content-Query-Parameter für Teil-Payloads.| Accept | string Example: application/json Erzwingt JSON-Response |
| id | integer |
| user_id | integer |
| created | string |
| created_at | string |
| updated | string |
| updated_at | string |
| type | string |
| address | string |
| zip | string |
| city | string |
| country | string |
| custom_number | string or null |
| shared | boolean |
[- {
- "id": 1508,
- "user_id": 4,
- "created": "2026-08-17T13:42:11+00:00",
- "created_at": "2026-08-17T13:42:11.000000Z",
- "updated": "2026-08-17T14:15:02+00:00",
- "updated_at": "2026-08-17T14:15:02.000000Z",
- "type": "0",
- "address": "Am Markt 4",
- "zip": "19386",
- "city": "Lübz",
- "country": "Deutschland",
- "custom_number": "OBJ-2026-042",
- "shared": false
}, - {
- "id": 1487,
- "user_id": 4,
- "created": "2026-07-03T09:20:00+00:00",
- "created_at": "2026-07-03T09:20:00.000000Z",
- "updated": "2026-08-10T16:44:12+00:00",
- "updated_at": "2026-08-10T16:44:12.000000Z",
- "type": "1",
- "address": "Wallstraße 12",
- "zip": "19053",
- "city": "Schwerin",
- "country": "Deutschland",
- "custom_number": null,
- "shared": true
}
]Erstellt ein neues Projekt mit Adressdaten und Objekttyp. Das Projekt wird dem aktuell authentifizierten Benutzer als Eigentümer zugeordnet.
Authentifizierung: Bearer Token (Laravel Sanctum) erforderlich.
Body-Parameter (JSON):
Pflichtfelder:
address (string, required) — Straße und Hausnummer der Immobilie.zip (string, required) — Postleitzahl.city (string, required) — Stadt/Ort.country (string, required) — Land (z. B. Deutschland).type (string, required, ObjectTypeEnum) — Objekttyp gemäß Gebäudeklassen nach NHK 2010 / Sachwertrichtlinie. Erlaubte Werte sind numerische Strings, u. a.:"0" — Eigentumswohnung"1" — Ein- oder Zweifamilienhaus freistehend"2" — Ein-/Zweifamilienhaus als Doppelhaus/Reihenendhaus"3" — Ein-/Zweifamilienhaus als Reihenmittelhaus"4.1" / "4.2" / "4.3" — Mehrfamilienhaus (≤ 6 WE / 7–20 WE / > 20 WE)"5.1" / "5.2" / "5.3" — Wohn-/Geschäftshäuser mit Mischnutzung"6" / "6.2" — Bürogebäude (Massivbau / Stahlbetonskelettbau)"18.6" sowie "20" (Sonstiges). Vollständige Liste in App\Enums\ObjectTypeEnum.Optional:
apartment_number (nullable) — Wohnungsnummer, falls type = "0" (Eigentumswohnung).apartment_location (nullable) — Lage der Wohnung im Haus (z. B. EG links).shared (boolean, nullable) — Projekt direkt beim Anlegen mit der Organisation teilen. Alternativ kann project.shareUserProject (PUT) den Status später togglen.custom_number (string, nullable) — Frei wählbare Kundennummer/Referenz für das Projekt (z. B. interne Objektnummer des Maklers).Response (200): JSON mit der ProjectResource des neu erstellten Projekts (inkl. id).
Fehler:
{ "error": "error_http_error_unprocessable", "errors": ["msg1", "msg2", …] } (flaches String-Array).| Content-Type | string Example: application/json Laravel akzeptiert application/json (auch wenn Postman-Mode formdata ist) |
| Accept | string Example: application/json Erzwingt JSON-Response |
| address required | string Straße und Hausnummer der Immobilie. |
| zip required | string Postleitzahl. |
| city required | string Stadt/Ort. |
| country required | string Land der Immobilie. |
| type required | string Enum: "0" "1" "2" "3" Objekttyp aus ObjectTypeEnum (NHK 2010). Erlaubte Werte: |
| apartment_number | string Wohnungsnummer. optional. Sinnvoll wenn type= |
| apartment_location | string Lage der Wohnung im Haus. optional. |
| shared | boolean Direkt beim Anlegen mit der Organisation teilen. optional. Erlaubte Werte: |
| custom_number | string Frei wählbare Kundennummer/Referenz für das Projekt. optional. |
| id | integer |
| user_id | integer |
| type | string |
| address | string |
| zip | string |
| city | string |
| country | string |
| apartment_number | string |
| apartment_location | string |
| shared | boolean |
| created | string |
| created_at | string |
| updated | string |
| updated_at | string |
{- "address": "Am Markt 4",
- "zip": "19386",
- "city": "Lübz",
- "country": "Deutschland",
- "type": "0",
- "apartment_number": "3a",
- "apartment_location": "EG links",
- "shared": false,
- "custom_number": "OBJ-2026-042"
}{- "id": 1508,
- "user_id": 4,
- "type": "0",
- "address": "Am Markt 4",
- "zip": "19386",
- "city": "Lübz",
- "country": "Deutschland",
- "apartment_number": "3a",
- "apartment_location": "EG links",
- "shared": false,
- "created": "2026-08-17T13:42:11+00:00",
- "created_at": "2026-08-17T13:42:11.000000Z",
- "updated": "2026-08-17T13:42:11+00:00",
- "updated_at": "2026-08-17T13:42:11.000000Z"
}Liefert die Detailansicht eines einzelnen Projekts. Der Umfang der Antwort lässt sich über den content-Query-Parameter steuern.
Authentifizierung: Bearer Token (Laravel Sanctum) erforderlich. Der Owner-Check ist im Controller aktuell auskommentiert (// später wieder aktivieren).
Path-Parameter:
project (integer, required) — ID des Projekts.Query-Parameter:
content (string, optional) — Steuert den Response-Umfang. Erlaubte Werte:minimal — Nur baseData (Stammdaten + Zähler + Vorschau-Bild).datasheet — baseData + sheetData (Datenblatt-Felder wie living_area, year, construction_type etc.).scans — baseData + scans[]-Array (voll ausgeladene ScanResource).files — baseData + files[]-Array (voll ausgeladene FileResource).Response (200): JSON-Objekt der ProjectResource. Die Felder pro content-Modus:
baseData (immer enthalten):
id, created, created_at, updated, updated_at.type (string aus ObjectTypeEnum).address, zip, city, country (mit Fallback-Strings).custom_number (string, nullable) — freie Kundennummer/Referenz.image — voll ausgeladene FileResource des Vorschau-Bilds (oder null, falls kein Bild).scans_count, files_count (integer).sheetData (bei default und datasheet):
construction_type, living_area, use_area, property_area, business_area, floors, units, price, year (string, nullable).apartment_number, apartment_location (string, nullable).apartment_rented, apartment_multiple_floors, house_flat, house_business, house_attic, house_cellar, business_flat, business_use, garden (boolean, nullable — durch boolOrNull() casted).shared (boolean).scans[] (bei default und scans): Array von ScanResource-Objekten.
files[] (bei default und files): Array von FileResource-Objekten.
Fehler:
{"error": "error_http_error_project_not_found"}).| project required | string Path-Parameter |
| content | string Optional. Steuert Response-Umfang. Erlaubte Werte: |
| Accept | string Example: application/json Erzwingt JSON-Response |
| id | integer |
| user_id | integer |
| created | string |
| created_at | string |
| updated | string |
| updated_at | string |
| type | string |
| address | string |
| zip | string |
| city | string |
| country | string |
object | |
| scans_count | integer |
| files_count | integer |
Array of objects | |
Array of objects | |
| construction_type | string |
| living_area | string |
| use_area | string |
| property_area | string |
| business_area | string or null |
| floors | string |
| units | string |
| price | string |
| year | string |
| apartment_number | string or null |
| apartment_location | string or null |
| apartment_rented | string or null |
| apartment_multiple_floors | string or null |
| house_flat | boolean |
| house_business | boolean |
| house_attic | boolean |
| house_cellar | boolean |
| business_flat | string or null |
| business_use | string or null |
| garden | boolean |
| shared | boolean |
{- "id": 101,
- "user_id": 4,
- "created": "2025-12-04T09:12:33+00:00",
- "created_at": "2025-12-04T09:12:33.000000Z",
- "updated": "2026-01-15T14:08:21+00:00",
- "updated_at": "2026-01-15T14:08:21.000000Z",
- "type": "type_1",
- "address": "Musterstraße 12",
- "zip": "10115",
- "city": "Berlin",
- "country": "DE",
- "image": {
- "id": 5001,
- "description": "Außenansicht",
- "mime_type": "image/jpeg",
- "name": "cover",
- "created_at": "2025-12-04T09:13:01.000000Z",
- "created": "2025-12-04T09:13:01+00:00"
}, - "scans_count": 2,
- "files_count": 4,
- "scans": [
- {
- "id": 9001,
- "description": "Erdgeschoss",
- "mime_type": "application/octet-stream",
- "name": "scan_eg",
- "created_at": "2025-12-04T09:20:11.000000Z",
- "created": "2025-12-04T09:20:11+00:00"
}
], - "files": [
- {
- "id": 5002,
- "description": "Grundbuchauszug",
- "mime_type": "application/pdf",
- "name": "grundbuch",
- "created_at": "2025-12-04T09:22:00.000000Z",
- "created": "2025-12-04T09:22:00+00:00"
}
], - "construction_type": "Massivbauweise",
- "living_area": "142",
- "use_area": "30",
- "property_area": "560",
- "business_area": null,
- "floors": "2",
- "units": "1",
- "price": "489000",
- "year": "1998",
- "apartment_number": null,
- "apartment_location": null,
- "apartment_rented": null,
- "apartment_multiple_floors": null,
- "house_flat": false,
- "house_business": false,
- "house_attic": true,
- "house_cellar": true,
- "business_flat": null,
- "business_use": null,
- "garden": true,
- "shared": false
}Aktualisiert einzelne oder mehrere Felder eines bestehenden Projekts. Alle Body-Felder sind optional (Partial Update) — es werden nur die übergebenen Felder geschrieben.
Authentifizierung: Bearer Token (Laravel Sanctum) erforderlich.
Path-Parameter:
project (integer, required) — ID des Projekts.Body-Parameter (JSON, alle optional, nullable):
Stammdaten:
address (string, nullable) — Straße und Hausnummer.zip (string, nullable) — Postleitzahl.city (string, nullable) — Stadt/Ort.country (string, nullable) — Land.type (string, nullable, ObjectTypeEnum) — Objekttyp gemäß Gebäudeklassen nach NHK 2010 / Sachwertrichtlinie. Erlaubte Werte sind numerische Strings, u. a.:"0" — Eigentumswohnung"1" — Ein- oder Zweifamilienhaus freistehend"2" — Doppelhaus/Reihenendhaus"3" — Reihenmittelhaus"4.1" / "4.2" / "4.3" — Mehrfamilienhaus (≤ 6 WE / 7–20 WE / > 20 WE)"5.1" / "5.2" / "5.3" — Wohn-/Geschäftshäuser mit Mischnutzung"6" / "6.2" — Bürogebäude"18.6" sowie "20" (Sonstiges). Vollständige Liste in App\Enums\ObjectTypeEnum.Bauliche Daten:
construction_type (string, nullable, in: Holzrahmenbau, Massivbauweise, Fachwerk) — Bauweise des Gebäudes.living_area (string, nullable) — Wohnfläche in m².use_area (string, nullable) — Nutzfläche in m².business_area (string, nullable) — Geschäftsfläche in m².property_area (string, nullable) — Grundstücksfläche in m².floors (string, nullable) — Anzahl der Geschosse.units (string, nullable) — Anzahl der Wohneinheiten.price (string, nullable) — Kaufpreis oder Marktpreis.year (string, nullable) — Baujahr.garden (boolean, nullable) — Garten vorhanden.Wohnungs-spezifisch:
apartment_number (string, nullable) — Wohnungsnummer.apartment_location (string, nullable) — Lage der Wohnung im Haus.apartment_rented (boolean, nullable) — Wohnung ist vermietet.apartment_multiple_floors (boolean, nullable) — Wohnung erstreckt sich über mehrere Etagen.Haus-spezifisch:
house_flat (boolean, nullable) — Haus enthält Wohnungen.house_business (boolean, nullable) — Haus enthält Gewerbeflächen.house_attic (boolean, nullable) — Haus hat einen Dachboden.house_cellar (boolean, nullable) — Haus hat einen Keller.Gewerbe-spezifisch:
business_flat (boolean, nullable) — Gewerbeobjekt enthält Wohnungen.business_use (string, nullable) — Art der gewerblichen Nutzung.Sonstiges:
shared (boolean, nullable) — Share-Status setzen. Alternativ togglet project.shareUserProject (PUT) diesen Wert.custom_number (string, nullable) — Frei wählbare Kundennummer/Referenz für das Projekt.Response (200): JSON mit dem aktualisierten Projekt.
Fehler:
{ "error": "error_http_error_unprocessable", "errors": ["msg1", "msg2", …] } (flaches String-Array).| project required | string Path-Parameter |
| Content-Type | string Example: application/json Laravel akzeptiert application/json (auch wenn Postman-Mode formdata ist) |
| Accept | string Example: application/json Erzwingt JSON-Response |
| address | string Straße und Hausnummer. optional. |
| zip | string Postleitzahl. optional. |
| city | string Stadt/Ort. optional. |
| country | string Land. optional. |
| type | string Enum: "0" "1" "2" "3" Objekttyp aus ObjectTypeEnum (NHK 2010). optional. Erlaubte Werte: numerische Strings wie |
| construction_type | string Enum: "Holzrahmenbau" "Massivbauweise" "Fachwerk" Bauweise. optional. Erlaubte Werte: |
| living_area | string Wohnfläche in m². optional. |
| use_area | string Nutzfläche in m². optional. |
| business_area | string Geschäftsfläche in m². optional. |
| property_area | string Grundstücksfläche in m². optional. |
| floors | string Anzahl der Geschosse. optional. |
| units | string Anzahl der Wohneinheiten. optional. |
| price | string Kaufpreis oder Marktpreis in Euro. optional. |
| year | string Baujahr (vierstellig). optional. |
| garden | boolean Garten vorhanden. optional. Erlaubte Werte: |
| apartment_number | string Wohnungsnummer. optional. |
| apartment_location | string Lage der Wohnung im Haus (z. B. EG links). optional. |
| apartment_rented | boolean Wohnung ist vermietet. optional. Erlaubte Werte: |
| apartment_multiple_floors | boolean Wohnung erstreckt sich über mehrere Etagen. optional. Erlaubte Werte: |
| house_flat | boolean Haus enthält Wohnungen. optional. Erlaubte Werte: |
| house_business | boolean Haus enthält Gewerbeflächen. optional. Erlaubte Werte: |
| house_attic | boolean Haus hat einen Dachboden. optional. Erlaubte Werte: |
| house_cellar | boolean Haus hat einen Keller. optional. Erlaubte Werte: |
| business_flat | boolean Gewerbeobjekt enthält Wohnungen. optional. Erlaubte Werte: |
| business_use | string Art der gewerblichen Nutzung. optional. |
| shared | boolean Share-Status setzen. optional. Erlaubte Werte: |
| custom_number | string Frei wählbare Kundennummer/Referenz für das Projekt. optional. |
| id | integer |
| user_id | integer |
| created | string |
| created_at | string |
| updated | string |
| updated_at | string |
| type | string |
| address | string |
| zip | string |
| city | string |
| country | string |
| image | string or null |
| scans_count | integer |
| files_count | integer |
| construction_type | string |
| living_area | string |
| use_area | string |
| property_area | string |
| business_area | string or null |
| floors | string |
| units | string |
| price | string |
| year | string |
| apartment_number | string or null |
| apartment_location | string or null |
| apartment_rented | string or null |
| apartment_multiple_floors | string or null |
| house_flat | boolean |
| house_business | boolean |
| house_attic | boolean |
| house_cellar | boolean |
| business_flat | string or null |
| business_use | string or null |
| garden | boolean |
| shared | boolean |
{- "address": "Am Markt 4",
- "zip": "19386",
- "city": "Lübz",
- "country": "Deutschland",
- "type": "0",
- "construction_type": "Massivbauweise",
- "living_area": "85.5",
- "floors": "2",
- "units": "1",
- "year": "1998",
- "garden": true,
- "apartment_rented": false,
- "apartment_multiple_floors": false,
- "house_flat": false,
- "house_business": false,
- "house_attic": false,
- "house_cellar": true,
- "business_flat": false,
- "shared": false,
- "custom_number": "OBJ-2026-042"
}{- "id": 101,
- "user_id": 4,
- "created": "2025-12-04T09:12:33+00:00",
- "created_at": "2025-12-04T09:12:33.000000Z",
- "updated": "2026-05-22T12:50:00+00:00",
- "updated_at": "2026-05-22T12:50:00.000000Z",
- "type": "type_1",
- "address": "Musterstraße 12a",
- "zip": "10115",
- "city": "Berlin",
- "country": "DE",
- "image": null,
- "scans_count": 0,
- "files_count": 0,
- "construction_type": "Massivbauweise",
- "living_area": "150",
- "use_area": "30",
- "property_area": "560",
- "business_area": null,
- "floors": "2",
- "units": "1",
- "price": "499000",
- "year": "1998",
- "apartment_number": null,
- "apartment_location": null,
- "apartment_rented": null,
- "apartment_multiple_floors": null,
- "house_flat": false,
- "house_business": false,
- "house_attic": true,
- "house_cellar": true,
- "business_flat": null,
- "business_use": null,
- "garden": true,
- "shared": false
}Archiviert ein Projekt per Soft-Delete (Eloquent delete() auf einem Model mit SoftDeletes-Trait). Das Projekt verschwindet aus den Standard-Queries (getUserProjects, getUserProject), bleibt aber in der DB erhalten und könnte serverseitig wiederhergestellt werden.
Authentifizierung: Bearer Token (Laravel Sanctum) erforderlich. Der Owner-Check (Projekt muss dem authentifizierten Benutzer gehören) ist im Controller aktuell auskommentiert (// später wieder aktivieren). Aktuell kann ein authentifizierter Benutzer theoretisch jedes Projekt archivieren.
Path-Parameter:
project (integer, required) — ID des zu archivierenden Projekts.Body / Query: Keine.
Response (200):
message (string) — "Project has been archived".Fehler:
{"error": "error_http_error_project_not_found"}).| project required | string Path-Parameter |
| Accept | string Example: application/json Erzwingt JSON-Response |
| message | string |
{- "message": "Project has been archived"
}Generiert eine signierte URL (Gültigkeit 30 Minuten) zur Order-Funnel-Page für das angegebene Projekt. Mit dieser URL kann der Benutzer ohne erneutes Login Produkte für das Projekt bestellen.
Authentifizierung: Bearer Token (Laravel Sanctum) erforderlich.
Path-Parameter:
project (integer, required) — ID des Projekts.Body / Query: Keine.
Response: JSON mit der signierten Order-URL (url).
| projectId required | string Path-Parameter |
| Accept | string Example: application/json Erzwingt JSON-Response |
| signed_url | string |
Liefert alle archivierten (soft-deleted) Projekte des authentifizierten Benutzers, plus zusätzlich alle archivierten Projekte, die innerhalb seines Customers geteilt (shared = true) sind.
Authentifizierung: Bearer Token (Laravel Sanctum) erforderlich.
Parameter: Keine.
Response (200): JSON-Array von ProjectEntryResource-Objekten (gleiche kompakte Listen-Repräsentation wie getUserProjects, aber ausschließlich soft-deleted Projekte über Project::onlyTrashed()). Felder pro Objekt:
id (integer)created / created_at — ISO-8601 und Laravel-Timestamp der Erstellung.updated / updated_at — dieselben für das letzte Update.type (string) — ObjectTypeEnum-Wert ("0" bis "20").address, zip, city, country (string) — mit Fallback-Strings wenn null.custom_number (string, nullable) — freie Kundennummer/Referenz.shared (boolean) — ob mit dem Customer geteilt.Verwandte Endpoints:
project.archiveUserProject (DELETE) — legt Projekte in den Archiv-Zustand.project.restoreUserProject (PUT) — stellt ein archiviertes Projekt wieder her.project.getUserProjects — liefert die aktiven (nicht archivierten) Projekte.| Accept | string Example: application/json Erzwingt JSON-Response |
| id | integer |
| user_id | integer |
| created | string |
| created_at | string |
| updated | string |
| updated_at | string |
| type | string |
| address | string |
| zip | string |
| city | string |
| country | string |
| custom_number | string or null |
| shared | boolean |
[- {
- "id": 1421,
- "user_id": 4,
- "created": "2025-11-03T09:12:04+00:00",
- "created_at": "2025-11-03T09:12:04.000000Z",
- "updated": "2026-02-18T14:30:11+00:00",
- "updated_at": "2026-02-18T14:30:11.000000Z",
- "type": "0",
- "address": "Am Markt 4",
- "zip": "19386",
- "city": "Lübz",
- "country": "Deutschland",
- "custom_number": "OBJ-2025-217",
- "shared": false
}, - {
- "id": 1387,
- "user_id": 4,
- "created": "2025-08-21T16:44:52+00:00",
- "created_at": "2025-08-21T16:44:52.000000Z",
- "updated": "2026-01-09T10:17:33+00:00",
- "updated_at": "2026-01-09T10:17:33.000000Z",
- "type": "1",
- "address": "Wallstraße 12",
- "zip": "19053",
- "city": "Schwerin",
- "country": "Deutschland",
- "custom_number": null,
- "shared": true
}
]Stellt ein zuvor archiviertes (soft-deleted) Projekt wieder her — Gegenstück zu project.archiveUserProject. Sucht das Projekt gezielt in den soft-deleted Datensätzen (Project::onlyTrashed()) und ruft restore() darauf auf, wodurch deleted_at wieder auf null gesetzt wird.
Authentifizierung: Bearer Token (Laravel Sanctum) erforderlich. Der Owner-Check (Projekt muss dem authentifizierten Benutzer gehören) ist im Controller aktuell auskommentiert (// später wieder aktivieren). Aktuell kann ein authentifizierter Benutzer theoretisch jedes archivierte Projekt wiederherstellen.
Path-Parameter:
project (integer, required) — ID des wiederherzustellenden (archivierten) Projekts.Body / Query: Keine.
Response (200):
message (string) — "Project has been restored".Fehler:
{"error": "error_http_error_project_not_found"}). Achtung: Aktive (nicht archivierte) Projekte werden von diesem Endpoint ebenfalls als 404 behandelt, weil onlyTrashed() nur soft-deleted Datensätze zurückliefert.| project required | string Path-Parameter |
| Accept | string Example: application/json Erzwingt JSON-Response |
| message | string |
{- "message": "Project has been restored"
}Aktualisiert die Beschreibung einer Datei.
Authentifizierung: Bearer Token (Laravel Sanctum) erforderlich.
Path-Parameter:
project (integer, required) — ID des Projekts.fileId (integer, required) — ID der Datei.Body-Parameter (JSON):
description (string, optional, nullable, max: 255) — Neue Beschreibung der Datei. Bei null wird die Beschreibung entfernt.Response: JSON mit der aktualisierten Datei.
| project required | string Path-Parameter |
| fileId required | string Path-Parameter |
| Content-Type | string Example: application/json Laravel akzeptiert application/json (auch wenn Postman-Mode formdata ist) |
| Accept | string Example: application/json Erzwingt JSON-Response |
| description | string Neue Beschreibung der Datei (max. 255 Zeichen). optional. |
| id | integer |
| url | string |
| description | string |
| mime_type | string |
| name | string |
| created_at | string |
| created | string |
{- "description": "Neue Beschreibung der Datei"
}{- "id": 1842,
- "description": "Grundriss Erdgeschoss - aktualisiert",
- "mime_type": "application/pdf",
- "name": "grundriss-eg",
- "created_at": "2026-05-22T09:14:32.000000Z",
- "created": "2026-05-22T09:14:32+00:00"
}Löscht eine Datei. Ist diese mit einem Scan verknüpft, wird zusätzlich der Scan-Datensatz und das zugehörige S3-Objekt entfernt.
Authentifizierung: Bearer Token (Laravel Sanctum) erforderlich.
Path-Parameter:
project (integer, required) — ID des Projekts.fileId (integer, required) — ID der Datei.Body / Query: Keine.
Response: HTTP 204 / Success-Bestätigung.
| project required | string Path-Parameter |
| fileId required | string Path-Parameter |
| Accept | string Example: application/json Erzwingt JSON-Response |
| message | string |
{- "message": "file deleted"
}Lädt eine Datei herunter. Ist die Datei mit einem Scan verknüpft, wird intern die S3-Variante geliefert, ansonsten das lokal gespeicherte File.
Authentifizierung: Bearer Token (Laravel Sanctum) erforderlich.
Path-Parameter:
project (integer, required) — ID des Projekts.fileId (integer, required) — ID der Datei.Body / Query: Keine.
Response: Binary File Download (Content-Type entspricht dem Dateityp).
| project required | string Path-Parameter |
| fileId required | string Path-Parameter |
| Accept | string Example: application/json |
| download_url | string |
Bestätigt nach erfolgreichem S3-Direct-Upload die hochgeladene Datei. Das Backend ermittelt die tatsächliche Dateigröße direkt von S3 und setzt confirmed_at.
Authentifizierung: Bearer Token (Laravel Sanctum) erforderlich. Owner-Check auf dem Projekt (sonst HTTP 403).
Path-Parameter:
project (integer, required) — ID des Projekts.fileId (integer, required) — ID des zuvor via file.request-upload angelegten Files.Body / Query: Keine.
Response (200): Direkt die FileResource (NICHT mehr in { "file": ... } gewrappt) mit aktualisierter size und gesetztem confirmed_at. Der mime_type wird hier nicht mehr aktualisiert — der ist beim file.request-upload-Call vom Client bereits mitgegeben worden.
Fehler:
is_s3 = false), oder das S3-Objekt existiert nicht auf S3.confirmed_at ist nicht null).| project required | string Path-Parameter |
| fileId required | string Path-Parameter |
| Accept | string Example: application/json Erzwingt JSON-Response |
| id | integer |
| original_name | string |
| description | string |
| category | string |
| mime_type | string |
| size | integer |
| is_s3 | boolean |
| confirmed_at | string |
| created_at | string |
| updated_at | string |
{- "id": 4711,
- "original_name": "grundriss_eg.pdf",
- "description": "Grundriss Erdgeschoss",
- "category": "Grundriss",
- "mime_type": "application/pdf",
- "size": 524288,
- "is_s3": true,
- "confirmed_at": "2026-05-26T12:45:00+00:00",
- "created_at": "2026-05-26T12:44:42+00:00",
- "updated_at": "2026-05-26T12:45:00+00:00"
}Initiiert einen S3-Direct-Upload für eine Datei. Liefert eine signierte S3-Upload-URL (Gültigkeit 30 Minuten) sowie die HTTP-Header, die beim PUT mitgegeben werden müssen. Nach erfolgreichem S3-Upload file.confirm-upload aufrufen.
Authentifizierung: Bearer Token (Laravel Sanctum) erforderlich. Der Owner-Check (Projekt muss dem authentifizierten Benutzer gehören) ist im Code aktuell auskommentiert (//TODO: wieder aktivieren und Prüfung für MMM einbauen). Sobald reaktiviert, gibt es HTTP 403 zurück.
Path-Parameter:
project (integer, required) — ID des Projekts.Body-Parameter (JSON):
file_name (string, required) — Dateiname inkl. Erweiterung (z. B. grundriss_eg.pdf).description (string, required) — Beschreibung der Datei, die dem Benutzer angezeigt wird und zur Folder-Struktur beiträgt.mime_type (string, required) — MIME-Type der Datei (z. B. application/pdf, image/jpeg). Wird direkt am File-Record gespeichert und beim Upload zu S3 verwendet.Response (200):
file_id (integer) — ID des angelegten File-Records.upload_url (string) — Pre-Signed S3-PUT-URL.upload_header (object) — Header, die beim PUT auf upload_url gesendet werden müssen.expires_at (string, ISO-8601) — Ablaufzeit der signierten URL.Fehler:
| project required | string Path-Parameter |
| Content-Type | string Example: application/json Laravel akzeptiert application/json (auch wenn Postman-Mode formdata ist) |
| Accept | string Example: application/json Erzwingt JSON-Response |
| file_name required | string Dateiname inkl. Erweiterung. |
| description required | string Beschreibung der Datei für den Benutzer. |
| mime_type required | string MIME-Type der Datei (z. B. |
| file_id | integer |
| upload_url | string |
object | |
| expires_at | string |
{- "file_name": "grundriss_eg.pdf",
- "description": "Grundriss Erdgeschoss",
- "mime_type": "application/pdf"
}{- "file_id": 4711,
- "upload_header": {
- "Host": "wohnrechner.s3.eu-central-1.amazonaws.com"
}, - "expires_at": "2026-05-26T13:14:42+00:00"
}Lädt eine oder mehrere Dateien für ein Projekt hoch und kategorisiert sie. Dies ist der klassische multipart/form-data Upload (im Gegensatz zum S3-Direct-Upload über asset.request-upload).
Authentifizierung: Bearer Token (Laravel Sanctum) erforderlich.
Path-Parameter:
project (integer, required) — ID des Projekts.Body (multipart/form-data):
files[] (file[], required) — Array von Dateien zum Upload. Pro Index entspricht eine Datei.category[] (string[], required) — Array von Kategorien zur Klassifizierung jeder Datei (gleicher Index wie files[]).descriptions[] (string[], optional, nullable) — Array von Beschreibungen je Datei. Index muss mit files[] korrespondieren.Response: JSON-Array mit den neu angelegten File-Records (jeweils mit id).
| project required | string Path-Parameter |
| Accept | string Example: application/json Erzwingt JSON-Response |
| files[] required | string <binary> Datei zum Upload. Pro Upload können mehrere Dateien als files[0], files[1], … gesendet werden. |
| category[] required | string Kategorie der Datei (gleicher Index wie files[]). Beispiel-Werte: Grundriss, Foto, Vertrag, Energieausweis. |
| descriptions[] | string Beschreibung der Datei (gleicher Index wie files[]). optional. |
| id | integer |
| url | string |
| description | string |
| mime_type | string |
| name | string |
| created_at | string |
| created | string |
{ "files[]": "<binary>", "category[]": "Grundriss", "descriptions[]": "Grundriss EG" }
[- {
- "id": 1842,
- "description": "Grundriss Erdgeschoss",
- "mime_type": "application/pdf",
- "name": "grundriss-eg",
- "created_at": "2026-05-22T09:14:32.000000Z",
- "created": "2026-05-22T09:14:32+00:00"
}, - {
- "id": 1843,
- "description": "Außenansicht Süd",
- "mime_type": "image/jpeg",
- "name": "aussenansicht",
- "created_at": "2026-05-22T09:14:35.000000Z",
- "created": "2026-05-22T09:14:35+00:00"
}
]Aktualisiert die Beschreibung eines Scans.
Authentifizierung: Bearer Token (Laravel Sanctum) erforderlich. Owner-Check auf dem Projekt + Scan muss zum Projekt gehören.
Path-Parameter:
project (integer, required) — ID des Projekts.scan (integer, required) — ID des Scans.Body-Parameter (JSON):
description (string, optional, nullable, max: 255) — Neue Beschreibung des Scans. Bei null wird die Beschreibung entfernt.Response (200):
scan — die aktualisierte ScanResource (in { "scan": ... } gewrappt).Fehler:
| project required | string Path-Parameter |
| scan required | string Path-Parameter |
| Content-Type | string Example: application/json Laravel akzeptiert application/json (auch wenn Postman-Mode formdata ist) |
| Accept | string Example: application/json Erzwingt JSON-Response |
| description | string Neue Beschreibung des Scans (max. 255 Zeichen). optional. |
| id | integer |
| url | string |
| description | string |
| mime_type | string |
| name | string |
| created_at | string |
| created | string |
{- "description": "Aktualisierte Scan-Beschreibung"
}{- "id": 412,
- "description": "Raumscan Erdgeschoss - korrigiert",
- "mime_type": "text/plain",
- "name": "raumscan-eg.usdz",
- "created_at": "2026-05-22T10:22:11.000000Z",
- "created": "2026-05-22T10:22:11+00:00"
}Löscht einen Scan (Datenbankeintrag) sowie das zugehörige Objekt im S3-Bucket.
Authentifizierung: Bearer Token (Laravel Sanctum) erforderlich. Owner-Check auf dem Projekt + Scan muss zum Projekt gehören.
Path-Parameter:
project (integer, required) — ID des Projekts.scan (integer, required) — ID des zu löschenden Scans.Body / Query: Keine.
Response (200):
message (string) — "scan deleted".Fehler:
| project required | string Path-Parameter |
| scan required | string Path-Parameter |
| Accept | string Example: application/json Erzwingt JSON-Response |
| message | string |
{- "message": "scan deleted"
}Generiert eine signierte S3-Download-URL für einen Scan.
Authentifizierung: Bearer Token (Laravel Sanctum) erforderlich. Owner-Check auf dem Projekt + Scan muss zum Projekt gehören.
Path-Parameter:
project (integer, required) — ID des Projekts.scan (integer, required) — ID des Scans.Body / Query: Keine.
Response (200):
download_url (string) — temporäre, signierte S3-URL zum direkten Download.Fehler:
| project required | string Path-Parameter |
| scan required | string Path-Parameter |
| Accept | string Example: application/json Erzwingt JSON-Response |
| download_url | string |
Bestätigt nach erfolgreichem S3-Direct-Upload den hochgeladenen Scan. Das Backend ermittelt die tatsächliche Dateigröße direkt von S3 und setzt confirmed_at.
Authentifizierung: Bearer Token (Laravel Sanctum) erforderlich. Owner-Check auf dem Projekt + Scan muss zum Projekt gehören.
Path-Parameter:
project (integer, required) — ID des Projekts.scan (integer, required) — ID des zuvor via scan.request-upload angelegten Scans.Body / Query: Keine.
Response (200): Direkt die ScanResource (kein Wrapper) mit aktualisierter size und gesetztem confirmed_at.
Fehler:
| project required | string Path-Parameter |
| scan required | string Path-Parameter |
| Accept | string Example: application/json Erzwingt JSON-Response |
| id | integer |
| url | string |
| description | string |
| mime_type | string |
| name | string |
| created_at | string |
| created | string |
{- "id": 412,
- "description": "Raumscan Erdgeschoss",
- "mime_type": "text/plain",
- "name": "raumscan-eg.usdz",
- "created_at": "2026-05-22T10:22:11.000000Z",
- "created": "2026-05-22T10:22:11+00:00"
}Initiiert einen S3-Direct-Upload für einen Scan (typischerweise .usdz oder .obj). Liefert eine signierte S3-Upload-URL (Gültigkeit 30 Minuten) plus die HTTP-Header, die beim PUT mitgesendet werden müssen. Nach erfolgreichem S3-Upload scan.confirm-upload aufrufen.
Authentifizierung: Bearer Token (Laravel Sanctum) erforderlich. Owner-Check: das Projekt muss dem authentifizierten Benutzer gehören (sonst HTTP 403).
Path-Parameter:
project (integer, required) — ID des Projekts.Body-Parameter (JSON):
file_name (string, required) — Dateiname inkl. Erweiterung (z. B. wohnzimmer.usdz).description (string, required) — Beschreibung des Scans für den Benutzer.mime_type (string, required) — MIME-Type der Datei (z. B. model/vnd.usdz+zip für USDZ-Dateien).Response (200):
file_id (integer) — ID des angelegten Scans (Achtung: Response-Key heißt file_id, enthält aber die Scan-ID).upload_url (string) — Pre-Signed S3-PUT-URL.upload_header (object) — Header, die beim PUT auf upload_url gesendet werden müssen.expires_at (string, ISO-8601) — Ablaufzeit der signierten URL.Fehler:
| project required | string Path-Parameter |
| Content-Type | string Example: application/json Laravel akzeptiert application/json (auch wenn Postman-Mode formdata ist) |
| Accept | string Example: application/json Erzwingt JSON-Response |
| file_name required | string Dateiname inkl. Erweiterung. |
| description required | string Beschreibung des Scans für den Benutzer. |
| mime_type required | string MIME-Type der Datei (z. B. |
| scan_id | integer |
| upload_url | string |
object | |
| expires_at | string |
{- "file_name": "wohnzimmer.usdz",
- "description": "Wohnzimmer-Scan vom 26.05.2026",
- "mime_type": "model/vnd.usdz+zip"
}{- "scan_id": 75,
- "upload_header": {
- "Host": [
- "wohnrechner-office.nbg1.your-objectstorage.com"
]
}, - "expires_at": "2026-03-21T10:02:10+01:00"
}Alle In-App-Benachrichtigungen des authentifizierten Benutzers, chronologisch sortiert — gelesen wie ungelesen.
Liefert alle Benachrichtigungen des authentifizierten Benutzers (gelesen und ungelesen).
Authentifizierung: Bearer Token (Laravel Sanctum) erforderlich.
Parameter: Keine.
Response: JSON-Array mit allen Notification-Records des Benutzers (chronologisch).
| Accept | string Example: application/json Erzwingt JSON-Response |
| id | string |
| created_at | string |
| read_at | string or null |
object |
[- {
- "id": "9b1c8d12-4f3a-4e1b-9a2c-3e1f8b2c4d5e",
- "created_at": "2026-05-22T08:12:45.000000Z",
- "read_at": null,
- "data": {
- "title": "Neuer Auftrag eingegangen",
- "message": "Auftrag #4821 wurde erstellt.",
- "type": "order_created",
- "order_id": 4821
}
}, - {
- "id": "9b1c8d12-4f3a-4e1b-9a2c-3e1f8b2c4d5f",
- "created_at": "2026-05-21T16:03:22.000000Z",
- "read_at": "2026-05-21T17:20:01.000000Z",
- "data": {
- "title": "Zahlung erhalten",
- "message": "Zahlung für Auftrag #4815 verbucht.",
- "type": "payment_received",
- "order_id": 4815
}
}, - {
- "id": "9b1c8d12-4f3a-4e1b-9a2c-3e1f8b2c4d60",
- "created_at": "2026-05-20T11:45:09.000000Z",
- "read_at": "2026-05-20T12:00:14.000000Z",
- "data": {
- "title": "Scan-Upload abgeschlossen",
- "message": "Der Scan für Projekt #312 wurde erfolgreich hochgeladen.",
- "type": "scan_uploaded",
- "project_id": 312
}
}
]Liefert nur die ungelesenen Benachrichtigungen des authentifizierten Benutzers. Typischerweise verwendet für Badge-Counter im UI.
Authentifizierung: Bearer Token (Laravel Sanctum) erforderlich.
Parameter: Keine.
Response: JSON-Array mit ungelesenen Notifications (oder Anzahl der ungelesenen Notifications).
| Accept | string Example: application/json Erzwingt JSON-Response |
| id | string |
| created_at | string |
| read_at | string or null |
object |
[- {
- "id": "9b1c8d12-4f3a-4e1b-9a2c-3e1f8b2c4d5e",
- "created_at": "2026-05-22T08:12:45.000000Z",
- "read_at": null,
- "data": {
- "title": "Neuer Auftrag eingegangen",
- "message": "Auftrag #4821 wurde erstellt.",
- "type": "order_created",
- "order_id": 4821
}
}, - {
- "id": "9b1c8d12-4f3a-4e1b-9a2c-3e1f8b2c4d61",
- "created_at": "2026-05-22T07:01:11.000000Z",
- "read_at": null,
- "data": {
- "title": "Neue Datei hochgeladen",
- "message": "Ein neuer Grundriss wurde zu Projekt #314 hinzugefügt.",
- "type": "file_uploaded",
- "project_id": 314
}
}
]Liefert alle Bestellungen des authentifizierten Benutzers, chronologisch absteigend (neueste zuerst), inklusive des zugehörigen Projekts.
Authentifizierung: Bearer Token (Laravel Sanctum) erforderlich.
Parameter: Keine.
Response: JSON-Array von OrderEntryResource-Objekten — kompakte Listendarstellung pro Order (mit eingebettetem Projekt).
| Accept | string Example: application/json Erzwingt JSON-Response |
| id | integer |
| created | string |
| created_at | string |
| updated | string |
| updated_at | string |
| status | string |
| group | string |
| data_basis | string |
| medium | string |
| express | boolean |
| test | boolean |
| contact_person | string |
object |
[- {
- "id": 4821,
- "created": "2026-05-22T08:12:45+00:00",
- "created_at": "2026-05-22T08:12:45.000000Z",
- "updated": "2026-05-22T08:15:02+00:00",
- "updated_at": "2026-05-22T08:15:02.000000Z",
- "status": "pending",
- "group": "standard",
- "data_basis": "scan",
- "medium": "online",
- "express": false,
- "test": false,
- "contact_person": "Max Mustermann",
- "project": {
- "id": 314,
- "title": "Einfamilienhaus Lübz",
- "address": "Am Markt 4, 19386 Lübz"
}
}, - {
- "id": 4815,
- "created": "2026-05-21T11:45:00+00:00",
- "created_at": "2026-05-21T11:45:00.000000Z",
- "updated": "2026-05-21T16:03:22+00:00",
- "updated_at": "2026-05-21T16:03:22.000000Z",
- "status": "in_progress",
- "group": "express",
- "data_basis": "plans",
- "medium": "online",
- "express": true,
- "test": false,
- "contact_person": "Erika Beispiel",
- "project": {
- "id": 312,
- "title": "Mehrfamilienhaus Schwerin",
- "address": "Mecklenburgstraße 12, 19053 Schwerin"
}
}
]Liefert die Detailansicht einer einzelnen Bestellung des authentifizierten Benutzers, inklusive Projekt, zugewiesener Produkte und Zahlungen.
Authentifizierung: Bearer Token (Laravel Sanctum) erforderlich.
Path-Parameter:
order (integer, required) — ID der Bestellung (whereNumber-Constraint auf der Route).Body / Query: Keine.
Response: JSON-Objekt der OrderResource mit project-, products- und payments-Beziehungen.
Fehler: HTTP 404 mit {"error": "error_http_error_order_not_found"}, falls die Order nicht existiert.
Hinweis (Code-Stand 22.05.2026): Die Ownership-Prüfung (order.user_id === user.id) ist im Controller aktuell auskommentiert ("später wieder aktivieren"). Aktuell kann ein authentifizierter Benutzer also theoretisch jede Order-ID abrufen.
| order required | string Path-Parameter |
| Accept | string Example: application/json Erzwingt JSON-Response |
| id | integer |
| created | string |
| created_at | string |
| updated | string |
| updated_at | string |
| status | string |
| group | string |
| data_basis | string |
| medium | string |
| express | boolean |
| test | boolean |
| contact_person | string |
| contact_phone | string |
| contact_mail | string |
| notice | string |
| cellars | integer |
| attics | integer |
| stairs | integer |
| additional_buildings | integer |
| floors | integer |
| units | integer |
| rooms | integer |
| estimated_area | number |
| roof_slopes | boolean |
object | |
Array of objects | |
Array of objects |
{- "id": 4821,
- "created": "2026-05-22T08:12:45+00:00",
- "created_at": "2026-05-22T08:12:45.000000Z",
- "updated": "2026-05-22T08:15:02+00:00",
- "updated_at": "2026-05-22T08:15:02.000000Z",
- "status": "pending",
- "group": "standard",
- "data_basis": "scan",
- "medium": "online",
- "express": false,
- "test": false,
- "contact_person": "Max Mustermann",
- "contact_phone": "+49 38731 123456",
- "contact_mail": "max.mustermann@example.com",
- "notice": "Bitte Dachschrägen beachten.",
- "cellars": 1,
- "attics": 1,
- "stairs": 1,
- "additional_buildings": 0,
- "floors": 2,
- "units": 1,
- "rooms": 6,
- "estimated_area": 145.5,
- "roof_slopes": true,
- "project": {
- "id": 314,
- "title": "Einfamilienhaus Lübz",
- "address": "Am Markt 4, 19386 Lübz"
}, - "products": [
- {
- "id": 9821,
- "type": "floor_plan",
- "status": "queued",
- "units": 2,
- "date": "2026-05-25",
- "assigned_to": null,
- "needs_attention": false,
- "created_at": "2026-05-22T08:12:45.000000Z",
- "updated_at": "2026-05-22T08:12:45.000000Z"
}, - {
- "id": 9822,
- "type": "area_calculation",
- "status": "queued",
- "units": 1,
- "date": "2026-05-25",
- "assigned_to": null,
- "needs_attention": false,
- "created_at": "2026-05-22T08:12:45.000000Z",
- "updated_at": "2026-05-22T08:12:45.000000Z"
}
], - "payments": [
- {
- "id": 7712,
- "payment_id": "pay_8ZQR4F2K",
- "title": "Rechnung Auftrag #4821",
- "amount": 24900,
- "fee_amount": 0,
- "currency": "EUR",
- "status": "pending",
- "payment_method": "gocardless",
- "valid_until": "2026-06-05",
- "due_date": "2026-06-05",
- "created_at": "2026-05-22T08:12:46.000000Z",
- "updated_at": "2026-05-22T08:12:46.000000Z"
}
]
}| Content-Type | string Example: application/json |
| default | string |
| express | string |
| appointment_default | string |
| appointment_express | string |
{- "default": "innerhalb von 4 - 5 Werktagen nach Vermessungstermin",
- "express": "innerhalb von 48 Stunden nach Vermessungstermin",
- "appointment_default": "innerhalb von 3 - 10 Werktagen",
- "appointment_express": "innerhalb von 3 Werktagen"
}| Content-Type | string Example: application/json |
| payment_url | string |
{- "project_type": "EFH",
- "project_address": "Musterstraße 1",
- "project_zip": "12345",
- "project_city": "Musterstadt",
- "floors": 2,
- "units": 1,
- "cellars": 1,
- "attics": 1,
- "buildings": 1,
- "calculation": true,
- "groundplan": true,
- "cut": true,
- "face": false,
- "cubature": false,
- "express": true,
- "appointment_contact_name": "Max Mustermann",
- "appointment_contact_phone": "0123456789",
- "appointment_request": "Bitte um Termin am Dienstag",
- "estimated_rooms": 5,
- "estimated_area": 120,
- "notice": "Keine besonderen Hinweise",
- "test": false
}{
}| Content-Type | string Example: application/json |
| payment_url | string |
{- "project_type": "EFH",
- "floors": 2,
- "units": 1,
- "cellars": 1,
- "attics": 1,
- "buildings": 0,
- "groundplan": 1,
- "cut": 1,
- "face": 0,
- "cubature": 0,
- "dwg": 1,
- "sales_optimized": 0,
- "express": 0,
- "project_address": "Musterstraße 12",
- "project_zip": "19386",
- "project_city": "Lübz",
- "estimated_area": "120",
- "estimated_rooms": "5",
- "appointment_contact_name": "Max Mustermann",
- "appointment_contact_phone": "0171 1234567",
- "appointment_request": "",
- "billing_firstname": "Max",
- "billing_lastname": "Mustermann",
- "billing_company": "Mustermann Immobilien GmbH",
- "billing_telephone": "0171 1234567",
- "billing_email": "max@mustermann.de",
- "billing_address": "Hauptstraße 5",
- "billing_zip": "19053",
- "billing_city": "Schwerin",
- "notice": "Terminwunsch: Mittwoch oder Freitag nachmittags",
- "price": 618.8,
- "origin": "onoffice",
- "test": false
}{
}| Content-Type | string Example: application/json |
| expressEnabled | string |
| default | string |
| express | string |
{- "expressEnabled": "1",
- "default": "innerhalb von 4 - 5 Werktagen",
- "express": "innerhalb von 48 Stunden"
}| Content-Type | string Example: application/json |
| payment_url | string |
{- "project_address": "Musterstraße 2",
- "project_zip": "54321",
- "project_city": "Beispielstadt",
- "project_type": "ETW",
- "floors": 3,
- "units": 6,
- "calculation": true,
- "groundplan": true,
- "cut": true,
- "face": true,
- "cubature": false,
- "express": false,
- "notice": "Bitte schnell bearbeiten",
- "test": true
}{
}Liefert die Mindest-Versionen, die ein mobiler Client (App, iOS) erfüllen muss, damit er gegen diese API laufen darf. Wird beim App-Start abgefragt, um den Benutzer ggf. zu einem Update zu zwingen.
Authentifizierung: Keine (öffentlicher Endpunkt, außerhalb der auth:sanctum-Middleware).
Parameter: Keine.
Response (JSON):
min_app_version (string) — Mindestversion der Android/Cross-Platform-App.min_ios_version (string) — Mindestversion der iOS-App.Werte werden aus GlobalSettingsUtility::get('minAppVersion') und GlobalSettingsUtility::get('minIosVersion') gelesen.
| Accept | string Example: application/json Erzwingt JSON-Response |
| min_app_version | string |
| min_ios_version | string |
{- "min_app_version": "0.5.3",
- "min_ios_version": "17.2.0"
}