WohnScanner API (1.0.0)

Download OpenAPI specification:

W.O. wohnrechner.online GmbH: kontakt@wohnrechner.online URL: https://wohnrechner.online

Offizielle REST-API von wohnrechner.online (W.O. wohnrechner.online GmbH).

Authentifizierung: Bearer Token (per POST /api/v1/login zu erzeugen).

auth

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.

app.login

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.

Authorizations:
bearerAuth
query Parameters
name
string
Example: name={{api_user}}
password
string
Example: password={{api_password}}
device_name
string
Example: device_name=postman
header Parameters
Content-Type
string
Example: application/json

Laravel akzeptiert application/json (auch wenn Postman-Mode formdata ist)

Accept
string
Example: application/json

Erzwingt JSON-Response

Responses

Response Schema: application/json
user_id
integer
token
string

Response samples

Content type
application/json
{
  • "user_id": 1234,
  • "token": "1|abcdef0123456789xyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
}

app.revoke-logout

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.

Authorizations:
bearerAuth
header Parameters
Accept
string
Example: application/json

Erzwingt JSON-Response

Responses

Response Schema: application/json
message
string

Response samples

Content type
application/json
{
  • "message": "Logged out successfully"
}

app.revoke

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.

Authorizations:
bearerAuth
header Parameters
Accept
string
Example: application/json

Erzwingt JSON-Response

Responses

Response Schema: application/json
message
string

Response samples

Content type
application/json
{
  • "message": "Logged out successfully"
}

user

Endpunkte rund um den authentifizierten Benutzer: Stammdaten, zugewiesene Rollen, Session-Validierung und Logout über den UserApiController.

user.getUserDetail

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.

Authorizations:
bearerAuth
header Parameters
Accept
string
Example: application/json

Erzwingt JSON-Response

Responses

Response Schema: application/json
name
string
salutation
string
first_name
string
last_name
string
email
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

Response samples

Content type
application/json
{
  • "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"
}

user.getUserRoles

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.

Authorizations:
bearerAuth
header Parameters
Accept
string
Example: application/json

Erzwingt JSON-Response

Responses

Response Schema: application/json
Array
string

Response samples

Content type
application/json
[
  • "AppUser",
  • "Customer"
]

user.session

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.

Authorizations:
bearerAuth
header Parameters
Accept
string
Example: application/json

Erzwingt JSON-Response

Responses

Response Schema: application/json
boolean

Response samples

Content type
application/json
true

user.logout

Logout-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.

Authorizations:
bearerAuth
header Parameters
Accept
string
Example: application/json

Erzwingt JSON-Response

Responses

Response Schema: application/json
message
string

Response samples

Content type
application/json
{
  • "message": "Logged out successfully"
}

projects

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.

project.getUserProjects

Liefert alle Projekte des authentifizierten Benutzers. Enthält drei Quellen:

  1. Eigene Projekte — alle Projekte, bei denen user_id = eingeloggter Benutzer.
  2. Geteilte Projekte innerhalb des Customers — Projekte anderer Benutzer mit shared = true, deren Eigentümer denselben customer_id haben wie der aufrufende Benutzer.
  3. Zugewiesene Projekte — Projekte, in denen ein Product der Orders dem Benutzer zugewiesen ist (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.
Authorizations:
bearerAuth
header Parameters
Accept
string
Example: application/json

Erzwingt JSON-Response

Responses

Response Schema: application/json
Array
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

Response samples

Content type
application/json
[
  • {
    },
  • {
    }
]

project.createUserProject

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)
    • … weitere Werte bis "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:

  • HTTP 422 — Validierungsfehler. Beachte: Format ist NICHT der Laravel-Standard — es kommt { "error": "error_http_error_unprocessable", "errors": ["msg1", "msg2", …] } (flaches String-Array).
Authorizations:
bearerAuth
header Parameters
Content-Type
string
Example: application/json

Laravel akzeptiert application/json (auch wenn Postman-Mode formdata ist)

Accept
string
Example: application/json

Erzwingt JSON-Response

Request Body schema: application/json
required
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: 0 (Eigentumswohnung), 1 (EFH/ZFH freistehend), 2 (Doppelhaus/Reihenendhaus), 3 (Reihenmittelhaus), 4.1/4.2/4.3 (Mehrfamilienhaus), 5.1/5.2/5.3, 6/6.2 (Bürogebäude), …, 20 (Sonstiges). Volle Liste in App\Enums\ObjectTypeEnum.

apartment_number
string

Wohnungsnummer. optional. Sinnvoll wenn type=0 (Eigentumswohnung).

apartment_location
string

Lage der Wohnung im Haus. optional.

shared
boolean

Direkt beim Anlegen mit der Organisation teilen. optional. Erlaubte Werte: true, false.

custom_number
string

Frei wählbare Kundennummer/Referenz für das Projekt. optional.

Responses

Response Schema: application/json
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

Request samples

Content type
application/json
{
  • "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"
}

Response samples

Content type
application/json
{
  • "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"
}

project.getUserProject

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:
    • (nicht gesetzt)Vollständige Response (baseData + scans + files + sheetData).
    • 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:

  • HTTP 404 — Projekt nicht gefunden ({"error": "error_http_error_project_not_found"}).
Authorizations:
bearerAuth
path Parameters
project
required
string

Path-Parameter project

query Parameters
content
string

Optional. Steuert Response-Umfang. Erlaubte Werte: minimal, datasheet, scans, files. Nicht gesetzt = volle Response.

header Parameters
Accept
string
Example: application/json

Erzwingt JSON-Response

Responses

Response Schema: application/json
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

Response samples

Content type
application/json
{
  • "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": {},
  • "scans_count": 2,
  • "files_count": 4,
  • "scans": [],
  • "files": [],
  • "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
}

project.updateUserProject

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
    • … bis "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:

  • HTTP 422 — Validierungsfehler. Beachte: Format ist NICHT der Laravel-Standard — es kommt { "error": "error_http_error_unprocessable", "errors": ["msg1", "msg2", …] } (flaches String-Array).
Authorizations:
bearerAuth
path Parameters
project
required
string

Path-Parameter project

header Parameters
Content-Type
string
Example: application/json

Laravel akzeptiert application/json (auch wenn Postman-Mode formdata ist)

Accept
string
Example: application/json

Erzwingt JSON-Response

Request Body schema: application/json
required
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 0 (Eigentumswohnung), 1 (EFH/ZFH freistehend), 2/3 (Doppelhaus/Reihenhaus), 4.1/4.2/4.3 (Mehrfamilienhaus), 5.15.3, 6/6.2 (Bürogebäude), …, 20 (Sonstiges). Volle Liste in App\Enums\ObjectTypeEnum.

construction_type
string
Enum: "Holzrahmenbau" "Massivbauweise" "Fachwerk"

Bauweise. optional. Erlaubte Werte: Holzrahmenbau, Massivbauweise, Fachwerk.

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: true, false.

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: true, false.

apartment_multiple_floors
boolean

Wohnung erstreckt sich über mehrere Etagen. optional. Erlaubte Werte: true, false.

house_flat
boolean

Haus enthält Wohnungen. optional. Erlaubte Werte: true, false.

house_business
boolean

Haus enthält Gewerbeflächen. optional. Erlaubte Werte: true, false.

house_attic
boolean

Haus hat einen Dachboden. optional. Erlaubte Werte: true, false.

house_cellar
boolean

Haus hat einen Keller. optional. Erlaubte Werte: true, false.

business_flat
boolean

Gewerbeobjekt enthält Wohnungen. optional. Erlaubte Werte: true, false.

business_use
string

Art der gewerblichen Nutzung. optional.

shared
boolean

Share-Status setzen. optional. Erlaubte Werte: true, false. Alternativ togglet project.shareUserProject (PUT) diesen Wert.

custom_number
string

Frei wählbare Kundennummer/Referenz für das Projekt. optional.

Responses

Response Schema: application/json
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

Request samples

Content type
application/json
{
  • "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"
}

Response samples

Content type
application/json
{
  • "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
}

project.archiveUserProject

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:

  • HTTP 404 — Projekt nicht gefunden ({"error": "error_http_error_project_not_found"}).
  • HTTP 401 — Projekt nicht im Besitz des Benutzers (aktuell deaktiviert, siehe oben).
Authorizations:
bearerAuth
path Parameters
project
required
string

Path-Parameter project

header Parameters
Accept
string
Example: application/json

Erzwingt JSON-Response

Responses

Response Schema: application/json
message
string

Response samples

Content type
application/json
{
  • "message": "Project has been archived"
}

project.shareUserProject

Toggelt den Share-Status des Projekts innerhalb der Organisation des Benutzers. Beim ersten Aufruf wird das Projekt geteilt, beim erneuten Aufruf wird der Zugriff wieder entzogen.

Authentifizierung: Bearer Token (Laravel Sanctum) erforderlich.

Path-Parameter:

  • project (integer, required) — ID des Projekts.

Body / Query: Keine.

Response: JSON mit neuem Share-Status des Projekts.

Authorizations:
bearerAuth
path Parameters
project
required
string

Path-Parameter project

header Parameters
Accept
string
Example: application/json

Erzwingt JSON-Response

Responses

Response Schema: application/json
message
string

Response samples

Content type
application/json
{
  • "message": "Project has been shared with the organization"
}

project.getOrderUrl

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).

Authorizations:
bearerAuth
path Parameters
projectId
required
string

Path-Parameter projectId

header Parameters
Accept
string
Example: application/json

Erzwingt JSON-Response

Responses

Response Schema: application/json
signed_url
string

project.getUserArchivedProjects

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.
Authorizations:
bearerAuth
header Parameters
Accept
string
Example: application/json

Erzwingt JSON-Response

Responses

Response Schema: application/json
Array
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

Response samples

Content type
application/json
[
  • {
    },
  • {
    }
]

project.restoreUserProject

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:

  • HTTP 404 — Projekt nicht in den archivierten Projekten gefunden ({"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.
  • HTTP 401 — Projekt nicht im Besitz des Benutzers (aktuell deaktiviert, siehe oben).
Authorizations:
bearerAuth
path Parameters
project
required
string

Path-Parameter project

header Parameters
Accept
string
Example: application/json

Erzwingt JSON-Response

Responses

Response Schema: application/json
message
string

Response samples

Content type
application/json
{
  • "message": "Project has been restored"
}

projects > files

file.updateDescription

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.

Authorizations:
bearerAuth
path Parameters
project
required
string

Path-Parameter project

fileId
required
string

Path-Parameter fileId

header Parameters
Content-Type
string
Example: application/json

Laravel akzeptiert application/json (auch wenn Postman-Mode formdata ist)

Accept
string
Example: application/json

Erzwingt JSON-Response

Request Body schema: application/json
required
description
string

Neue Beschreibung der Datei (max. 255 Zeichen). optional.

Responses

Response Schema: application/json
id
integer
url
string
description
string
mime_type
string
name
string
created_at
string
created
string

Request samples

Content type
application/json
{
  • "description": "Neue Beschreibung der Datei"
}

Response samples

Content type
application/json
{}

file.destroy

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.

Authorizations:
bearerAuth
path Parameters
project
required
string

Path-Parameter project

fileId
required
string

Path-Parameter fileId

header Parameters
Accept
string
Example: application/json

Erzwingt JSON-Response

Responses

Response Schema: application/json
message
string

Response samples

Content type
application/json
{
  • "message": "file deleted"
}

file.download

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).

Authorizations:
bearerAuth
path Parameters
project
required
string

Path-Parameter project

fileId
required
string

Path-Parameter fileId

header Parameters
Accept
string
Example: application/json

Responses

Response Schema: application/json
download_url
string

file.confirm-upload

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:

  • HTTP 403 — Projekt nicht im Besitz des Benutzers.
  • HTTP 404 — File-Record nicht gefunden, File nicht S3-basiert (is_s3 = false), oder das S3-Objekt existiert nicht auf S3.
  • HTTP 401 — File ist nicht mit diesem Projekt verknüpft.
  • HTTP 409 — File wurde bereits zuvor bestätigt (confirmed_at ist nicht null).
Authorizations:
bearerAuth
path Parameters
project
required
string

Path-Parameter project

fileId
required
string

Path-Parameter fileId

header Parameters
Accept
string
Example: application/json

Erzwingt JSON-Response

Responses

Response Schema: application/json
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

Response samples

Content type
application/json
{
  • "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"
}

file.request-upload

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:

  • HTTP 422 — Validierungsfehler (fehlende Pflichtfelder).
  • HTTP 403 — Projekt nicht im Besitz des Benutzers (aktuell deaktiviert, siehe oben).
Authorizations:
bearerAuth
path Parameters
project
required
string

Path-Parameter project

header Parameters
Content-Type
string
Example: application/json

Laravel akzeptiert application/json (auch wenn Postman-Mode formdata ist)

Accept
string
Example: application/json

Erzwingt JSON-Response

Request Body schema: application/json
required
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. application/pdf, image/jpeg, image/png, application/zip).

Responses

Response Schema: application/json
file_id
integer
upload_url
string
object
expires_at
string

Request samples

Content type
application/json
{
  • "file_name": "grundriss_eg.pdf",
  • "description": "Grundriss Erdgeschoss",
  • "mime_type": "application/pdf"
}

Response samples

Content type
application/json

file.store

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).

Authorizations:
bearerAuth
path Parameters
project
required
string

Path-Parameter project

header Parameters
Accept
string
Example: application/json

Erzwingt JSON-Response

Request Body schema: multipart/form-data
required
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.

Responses

Response Schema: application/json
Array
id
integer
url
string
description
string
mime_type
string
name
string
created_at
string
created
string

Request samples

Content type
multipart/form-data
{
  "files[]": "<binary>",
  "category[]": "Grundriss",
  "descriptions[]": "Grundriss EG"
}

Response samples

Content type
application/json
[]

projects > scans

scan.description

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:

  • HTTP 403 — Projekt nicht im Besitz des Benutzers.
  • HTTP 404 — Scan gehört nicht zum übergebenen Projekt.
  • HTTP 422 — Validierungsfehler (description > 255 Zeichen).
Authorizations:
bearerAuth
path Parameters
project
required
string

Path-Parameter project

scan
required
string

Path-Parameter scan

header Parameters
Content-Type
string
Example: application/json

Laravel akzeptiert application/json (auch wenn Postman-Mode formdata ist)

Accept
string
Example: application/json

Erzwingt JSON-Response

Request Body schema: application/json
required
description
string

Neue Beschreibung des Scans (max. 255 Zeichen). optional.

Responses

Response Schema: application/json
id
integer
url
string
description
string
mime_type
string
name
string
created_at
string
created
string

Request samples

Content type
application/json
{
  • "description": "Aktualisierte Scan-Beschreibung"
}

Response samples

Content type
application/json
{}

scan.destroy

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:

  • HTTP 403 — Projekt nicht im Besitz des Benutzers.
  • HTTP 404 — Scan gehört nicht zum übergebenen Projekt.
Authorizations:
bearerAuth
path Parameters
project
required
string

Path-Parameter project

scan
required
string

Path-Parameter scan

header Parameters
Accept
string
Example: application/json

Erzwingt JSON-Response

Responses

Response Schema: application/json
message
string

Response samples

Content type
application/json
{
  • "message": "scan deleted"
}

scan.download

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:

  • HTTP 403 — Projekt nicht im Besitz des Benutzers.
  • HTTP 404 — Scan gehört nicht zum übergebenen Projekt.
Authorizations:
bearerAuth
path Parameters
project
required
string

Path-Parameter project

scan
required
string

Path-Parameter scan

header Parameters
Accept
string
Example: application/json

Erzwingt JSON-Response

Responses

Response Schema: application/json
download_url
string

scan.confirm-upload

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:

  • HTTP 403 — Projekt nicht im Besitz des Benutzers.
  • HTTP 404 — Scan gehört nicht zum übergebenen Projekt, oder das S3-Objekt existiert nicht auf S3.
  • HTTP 409 — Scan wurde bereits zuvor bestätigt.
Authorizations:
bearerAuth
path Parameters
project
required
string

Path-Parameter project

scan
required
string

Path-Parameter scan

header Parameters
Accept
string
Example: application/json

Erzwingt JSON-Response

Responses

Response Schema: application/json
id
integer
url
string
description
string
mime_type
string
name
string
created_at
string
created
string

Response samples

Content type
application/json
{}

scan.upload-request

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:

  • HTTP 403 — Projekt nicht im Besitz des Benutzers.
  • HTTP 422 — Validierungsfehler (fehlende Pflichtfelder).
Authorizations:
bearerAuth
path Parameters
project
required
string

Path-Parameter project

header Parameters
Content-Type
string
Example: application/json

Laravel akzeptiert application/json (auch wenn Postman-Mode formdata ist)

Accept
string
Example: application/json

Erzwingt JSON-Response

Request Body schema: application/json
required
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. model/vnd.usdz+zip für USDZ, model/obj für OBJ).

Responses

Response Schema: application/json
scan_id
integer
upload_url
string
object
expires_at
string

Request samples

Content type
application/json
{
  • "file_name": "wohnzimmer.usdz",
  • "description": "Wohnzimmer-Scan vom 26.05.2026",
  • "mime_type": "model/vnd.usdz+zip"
}

notifications

Alle In-App-Benachrichtigungen des authentifizierten Benutzers, chronologisch sortiert — gelesen wie ungelesen.

getNotifications

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).

Authorizations:
bearerAuth
header Parameters
Accept
string
Example: application/json

Erzwingt JSON-Response

Responses

Response Schema: application/json
Array
id
string
created_at
string
read_at
string or null
object

Response samples

Content type
application/json
[
  • {
    },
  • {
    },
  • {
    }
]

getUnreadNotifications

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).

Authorizations:
bearerAuth
header Parameters
Accept
string
Example: application/json

Erzwingt JSON-Response

Responses

Response Schema: application/json
Array
id
string
created_at
string
read_at
string or null
object

Response samples

Content type
application/json
[
  • {
    },
  • {
    }
]

orders

Bestellungen des authentifizierten Benutzers (Liste + Detail).

order.getUserOrders

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).

Authorizations:
bearerAuth
header Parameters
Accept
string
Example: application/json

Erzwingt JSON-Response

Responses

Response Schema: application/json
Array
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

Response samples

Content type
application/json
[
  • {
    },
  • {
    }
]

order.getUserOrder

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.

Authorizations:
bearerAuth
path Parameters
order
required
string

Path-Parameter order

header Parameters
Accept
string
Example: application/json

Erzwingt JSON-Response

Responses

Response Schema: application/json
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

Response samples

Content type
application/json
{
  • "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": {
    },
  • "products": [
    ],
  • "payments": [
    ]
}

building survey

Building Survey – Get Price

Authorizations:
bearerAuth
header Parameters
Content-Type
string
Example: application/json

Responses

Response Schema: application/json
price
integer

Response samples

Content type
application/json
{
  • "price": 100
}

Building Survey – Get Delivery Times

Authorizations:
bearerAuth
header Parameters
Content-Type
string
Example: application/json

Responses

Response Schema: application/json
default
string
express
string
appointment_default
string
appointment_express
string

Response samples

Content type
application/json
{
  • "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"
}

Onsite Order – Get Payment Link - with Token

Authorizations:
bearerAuth
header Parameters
Content-Type
string
Example: application/json
Request Body schema: application/json
object

Responses

Response Schema: application/json
payment_url
string

Request samples

Content type
application/json
{
  • "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
}

Response samples

Content type
application/json

Onsite Order – Place Order - with Token

Authorizations:
bearerAuth
header Parameters
Content-Type
string
Example: application/json
Request Body schema: application/json
object

Responses

Response Schema: application/json
payment_url
string

Request samples

Content type
application/json
{
  • "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
}

Response samples

Content type
application/json

floorplan service

Floorplan Service – Get Price

Authorizations:
bearerAuth
header Parameters
Content-Type
string
Example: application/json

Responses

Response Schema: application/json
price
integer

Response samples

Content type
application/json
{
  • "price": 100
}

Floorplan Service – Get Delivery Times

Authorizations:
bearerAuth
header Parameters
Content-Type
string
Example: application/json

Responses

Response Schema: application/json
expressEnabled
string
default
string
express
string

Response samples

Content type
application/json
{
  • "expressEnabled": "1",
  • "default": "innerhalb von 4 - 5 Werktagen",
  • "express": "innerhalb von 48 Stunden"
}

Groundplan Document Order – Place Order - with Token

Authorizations:
bearerAuth
header Parameters
Content-Type
string
Example: application/json
Request Body schema: application/json
object

Responses

Response Schema: application/json
payment_url
string

Request samples

Content type
application/json
{
  • "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
}

Response samples

Content type
application/json

General

configuration

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.

Authorizations:
bearerAuth
header Parameters
Accept
string
Example: application/json

Erzwingt JSON-Response

Responses

Response Schema: application/json
min_app_version
string
min_ios_version
string

Response samples

Content type
application/json
{
  • "min_app_version": "0.5.3",
  • "min_ios_version": "17.2.0"
}