---
title: "API-Funktion Projekterstellung V2 (Beta)"
description: "Diese Funktion stellt die Projekterstellung (addProject) via Schnittstelle (API) bereit. Hierbei handelt es sich um die v2, die in naher Zukunft die v1 ablösen wird."
url: https://support.grundsteine.com/de/articles/109-api-funktion-projekterstellung-v2-beta
collection: "Vor dem Projekt"
updated: 2026-10-23
language: de
---

# API-Funktion Projekterstellung V2 (Beta)

Diese Funktion stellt die Projekterstellung (addProject) via Schnittstelle (API) bereit. Hierbei handelt es sich um die v2, die in naher Zukunft die v1 ablösen wird.

> **Info:** Dies ist die Dokumentation der **V2** der `addProject`\-API. V2 befindet sich aktuell in Beta hinter dem Feature-Flag `showAddProjectV2`. V1 (`/addProject` bzw. `/v1/projects`) bleibt parallel ohne Einschränkung verfügbar. Eine Übersicht der Unterschiede findest du am Ende dieses Dokuments im Abschnitt Unterschiede zu V1. Die v2 wird in naher Zukunft die v1 ablösen.

## **Übersicht**

Die `addProject` Funktion ermöglicht es externen Systemen, neue Projekte über eine HTTP-Schnittstelle anzulegen. Sie wird typischerweise verwendet, um Projektdaten von externen Quellen (z. B. Website-Formularen, Partner-Systemen, CRM/ERP) automatisiert zu übernehmen.

## **Zweck**

Die Funktion ermöglicht:

-   Das Erstellen neuer Projekte mit Gebäude- und Kontaktdaten über eine REST-API
    
-   Die sichere Authentifizierung mittels widerrufbarem JWT-Token (JTI-basierte Revokation)
    
-   Eine **intelligente Kontaktauflösung** (Verknüpfen statt immer neu Anlegen)
    
-   Detaillierte Eingabe-Validierung mit feldgenauen Fehlermeldungen
    
-   Die Verwendung von Projektvorlagen (Templates)
    
-   Die automatische E-Mail-Benachrichtigung bei Fehlern
    

## **Voraussetzungen**

> **Info:** **Beta-Feature-Flag**
> V2 ist hinter dem Beta-Feature-Flag `showAddProjectV2` abgesichert. Ohne aktives Flag liefert der Endpunkt **HTTP 403** zurück. Das Flag kannst du dir selbst freischalten unter [Einstellungen → Im-/Export & Vorschau](https://app.grundsteine.com/settings?tab=features) („Vorschau auf kommende Funktionen" → **addProject Public API**)

## **Authentifizierung**

### **JWT-Token**

Die Funktion verwendet JWT (JSON Web Token) zur Authentifizierung. Das Token wird als Query-Parameter `token` übergeben.

### **Token-Freischaltung**

**Wichtig:** Die Freischaltung eines Tokens kann über den Support ermöglicht werden.

Nach Freischaltung kannst du das Token unter [Einstellungen → Im-/Export & Vorschau](https://app.grundsteine.com/settings?tab=privacy) generieren.

### **Widerruf (Revoke)**

Tokens können in den Einstellungen jederzeit widerrufen werden. Nach einem Widerruf sind sowohl der widerrufene JTI-Token als auch alle Legacy-Tokens (ohne JTI) dauerhaft ungültig — auch dann, wenn das `APP_SECRET` weiterhin korrekt ist.

## **API-Endpunkt**

```javascript
POST https://eba-api.azurewebsites.net/v2/projects?token=MEIN_TOKEN
```

### **HTTP-Methode**

`POST`

### **URL-Parameter**

-   `token` (erforderlich): JWT-Token zur Authentifizierung
    

## **Request Body**

Der Request Body muss ein JSON-Objekt mit dem Feld `data` enthalten.

### **Parameter-Übersicht**

#### `data` **(oberste Ebene)**

Parameter

Typ

Pflicht

Standard

Beschreibung

<table data-id="51ff497a-4923-4d5f-9946-36ebef5148c8" style="min-width: 125px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"><col style="min-width: 25px;"><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18);"><p data-id="8f550cb4-bd16-4586-be48-ed9d474a941d"><code>client</code></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18);"><p data-id="74a4caf9-182d-4b65-947d-809375777c99">Objekt</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18);"><p data-id="097011ce-3eff-4809-8c4c-091f501ff5a1"><strong>ja</strong></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18);"><p data-id="a6a1239f-aa08-4682-85d4-7428cc5f0076">–</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18);"><p data-id="ecfa102e-2040-4f41-ba66-48cb05e7e863">Kontaktdaten des Kunden (siehe <code>client</code>-Parameter). <code>client.lastName</code> ist Pflicht. Über <code>client.contactId</code> kannst du das Projekt direkt mit einem existierenden Kontakt verknüpfen, andernfalls greift die <a target="_blank" rel="noopener noreferrer nofollow" class="linktype-link link" data-linktype="link" href="#1eb587b5-3a4d-43df-ac78-bf80ecaac1f1">Kontaktauflösung</a>.</p></td></tr><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="7eaa3913-ac3c-4c2b-b102-33c6aeb138ab"><code>building</code></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="6d9915bc-4329-4f48-84c6-86676f598957">Objekt</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="5e20f9f2-32e3-4d64-8ec2-ebf0f6aa85e0"><strong>ja</strong></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="3bd18d92-2b57-4eec-94db-db3d47cc9da0">–</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="57389513-cd53-4ecb-bfa8-7b53d1e566ed">Gebäudedaten (siehe <code>building</code>-Parameter)</p></td></tr><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="563a269e-f108-475c-b9fe-bf97ce441a27"><code>reference</code></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="8967a6e5-8cf5-4936-be55-3578699416e2">string</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="353a6158-e462-42d6-8250-f68a897ce6be">nein</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="881ac567-f270-43f4-84a2-fa784135d7af"><em>automatisch</em></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="9f4c07f5-f519-4547-8330-8e669333c896">Freie Referenz für das Projekt. <span data-name="new" data-type="emoji">🆕</span><strong> V2:</strong> Wird kein Wert übergeben, generiert das System automatisch die nächste Nummer (basierend auf der zuletzt angelegten Projektreferenz, Fallback <code>0001</code>).</p></td></tr><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="d3a64980-773d-4eff-b4ec-3ee9d9ac0e0d"><code>note</code></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="401acda0-cb8a-4764-92c1-d50c39a4a618">string</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="542e8e00-9315-4204-bc3a-21936fe151e8">nein</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="27f1faee-1b50-4ade-8ac9-046225d1d2de"><code>"Importiert via addProject API"</code></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="335d2934-b8da-49f1-b1f7-f940ca6faec4">Interne Notiz zum Projekt</p></td></tr><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="7946db79-e197-4f05-adde-83a3e2254052"><code>state</code></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="f91d5baa-75d1-41c0-9867-b5ec6ef217d7">enum</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="ba8037d5-697b-4b37-8926-a7b31690e799">nein</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="ae4c17a6-6ec0-452f-bd1d-f9d3f5c1de0d"><code>"ACTIVE"</code></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="fc88656e-83c5-4902-bad9-4b4aac1fbb57">Status des Projekts (siehe Enum <code>ProjectState</code>). <span data-name="new" data-type="emoji">🆕</span><strong> V2:</strong> <code>TEMPLATE</code> und <code>SYSTEM_TEMPLATE</code> sind explizit verboten.</p></td></tr><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="fafee243-f2f8-4ca5-bc9a-03a3211f0b63"><code>type</code></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="f803ad8a-20ee-4d6c-a13a-0203a93f4f15">string</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="223f31ee-5fb4-4ca0-8689-e01f56d303f3">nein</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="f83585d0-b274-4d03-ad7d-74eb65633d11"><code>"Anfrage/Angebot"</code></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="49060915-c3e6-4110-a549-ea49e8e76f4a">Projekttyp; überschreibt den Template-Typ, wenn <code>templateId</code> angegeben ist. Ohne <code>type</code> und <code>templateId</code> wird <code>"Anfrage/Angebot"</code> verwendet.</p></td></tr><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="4754c753-7504-450a-82d1-1171fca57f86"><code>templateId</code></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="c811d371-5d7d-4c17-a034-732c8fab47f5">string</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="abf63ad4-8914-4c93-adf6-70053d2367dc">nein</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="637f6297-6464-40c6-b934-03b39886523d">–</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="9f8a4dcc-c126-4d7d-98c0-4b6f5d0718fc">UUID einer Projektvorlage, deren Struktur und Einstellungen übernommen werden</p></td></tr></tbody></table>

#### `client` **(Kontaktdaten)**

Parameter

Typ

Pflicht

Beschreibung

<table data-id="d7c5967b-5a73-4fdb-a342-f6c1e3da797e" style="min-width: 100px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18);"><p data-id="3439cd5b-661e-46e5-85f0-a63386900fc5"><code>contactId</code></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18);"><p data-id="7f294215-9da1-4cc4-85cc-8016a2d75a5a">string</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18);"><p data-id="6907a828-d00b-4661-b4fb-3cff3fc8760e">nein <em>(</em><span data-name="new" data-type="emoji">🆕</span><em> V2)</em></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18);"><p data-id="7c7598b3-2095-4c8a-9382-a26f71d40619">UUID eines bereits existierenden Kontakts. Wenn gesetzt, wird das Projekt direkt mit diesem Kontakt verknüpft (muss zur gleichen Organisation gehören, sonst HTTP 404).</p></td></tr><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="759e170b-3d89-4413-9093-58204e3963fb"><code>reference</code></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="5d366816-884e-436c-a3a1-19fc973bfcf5">string</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="54a52d23-d922-48f5-836c-50c91ab33e3b">nein <em>(</em><span data-name="new" data-type="emoji">🆕</span><em> V2)</em></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="124595d4-9e27-4700-ae96-57a5e8050548">Kontaktnummer für neu angelegte Kontakte. Wird kein Wert übergeben, generiert das System automatisch die nächste Nummer (Fallback <code>0001</code>).</p></td></tr><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="5d849944-3c24-44c4-a6ce-a5000ae91cc9"><code>firstName</code></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="e49887da-7d8a-4b79-a4e7-8213813c9fd3">string</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="e25c23e7-00d6-4c84-b048-32c1cd14d4f2">nein</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="95c5ab2a-0c0b-4308-b09e-7f676bc059d5">Vorname des Kunden</p></td></tr><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="167661fe-b645-43a1-bfc9-8eaef8aa8eb3"><code>lastName</code></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="1627d0de-f816-4bfc-9fa3-660ff514de87">string</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="1954f21f-553a-4bc1-8b81-c40ac23cc112"><strong>ja</strong></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="452dcd4f-0d67-4250-8017-37e649cb9fe1">Nachname des Kunden</p></td></tr><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="06992f9d-f53f-45fa-9239-bc1ee77141d7"><code>email</code></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="de68dfc7-56b8-4b18-9fd8-223089547431">string</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="260c87e2-8627-4926-9a63-1d5951aa3d60">nein</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="9d88489d-74ab-4c2d-ab96-65ad689bdbf5">E-Mail-Adresse</p></td></tr><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="c3a77c52-8118-4ea3-a0bb-775c9a85cda6"><code>phone</code></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="5a474709-c52d-46e1-90dd-73eb4f7a1ec8">string</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="9584cfe3-6f9a-462c-b6e3-e576f0cd0523">nein</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="f3265cba-9dc1-4020-aff2-821e340035f8">Telefonnummer</p></td></tr><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="58d66269-a11d-4442-b93b-762120851874"><code>mobile</code></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="1b00074a-a047-4f83-b7b4-6f8cfbadbee2">string</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="756fe7dd-c46d-4ca4-8295-98c048a179bd">nein <em>(</em><span data-name="new" data-type="emoji">🆕</span><em> V2)</em></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="7e77af07-3482-43b2-844a-e9e683d3bb93">Mobilnummer; wird zusätzlich zum Field-Matching herangezogen</p></td></tr><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="b0ee2538-2083-48b1-819a-b0dd33043d56"><code>type</code></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="90beba15-19c7-42e6-a981-2bf1b56ccc6f">enum</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="2878715f-c563-406a-8aad-557e5ae3ec14">nein</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="696fa328-0836-4ab4-b190-6c8556f6fdaa">Kontakttyp (siehe Enum <code>ContactType</code>)</p></td></tr><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="9ea74113-da9d-4232-9faa-f724ec35d4cd"><code>companyName</code></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="ea175936-1b7d-471f-ab61-f6052871f938">string</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="cb2c07ba-0a5b-44b3-a881-416125db0822">nein</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="a654ea9e-86d1-4067-b515-7de8c34e3fbd">Firmenname (relevant bei <code>type: "COMPANY"</code>)</p></td></tr><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="fc963e84-574c-43af-836a-83506afda06a"><code>representedBy</code></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="baa0fd83-8abf-49ce-b7df-894fe3e171b3">string</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="a68de637-ecb0-4265-b500-1cd53073ecb4">nein</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="9892cdcb-aac1-4f1e-b13d-eed4a60f2115">Vertreten durch</p></td></tr><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="f732f4e8-1abe-483a-8d55-3ba7ef57a262"><code>title</code></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="343061bb-5b6b-457d-a534-f9c0877f72e0">string</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="08922974-a450-4a29-bd7d-0072096b62e7">nein</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="f2cb5d63-be5c-403e-a893-4a296c54d04e">Akademischer Titel, z. B. <code>"Dr."</code>, <code>"Prof."</code>, <code>"Prof. Dr."</code></p></td></tr><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="6dd26970-2c74-4a8a-8a99-3148c182936b"><code>salutation</code></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="78f3aa1c-ef3c-49df-944b-7ac8551d0c96">string</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="881be3fb-2b0f-448f-9f06-90270cbe79ba">nein</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="0c54f248-371d-4172-90ce-1c39ab5a6207">Anrede, z. B. <code>"Hallo"</code>, <code>"Sehr geehrte"</code>, <code>"Sehr geehrter"</code>, <code>"Guten Tag"</code></p></td></tr><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="3024c388-284a-43e4-b0d8-af9b8f7ca5a5"><code>address.street</code></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="a1a6cc1f-5621-42e4-bb40-6279bda45583">string</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="e85318f6-aa51-4b13-bb95-5669d22f4305">nein</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="88b300e7-ebc3-4df3-87cd-492598a4eb2e">Straße</p></td></tr><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="ccd50a09-1025-4184-b6ad-366745ebbab0"><code>address.houseNumber</code></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="91a47ba2-ffd8-4ec7-993c-097fe9249774">string</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="de20723a-919f-492b-839f-074c3404a1b5">nein</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="5b456d14-5618-4bca-8e36-8402134bf8b0">Hausnummer</p></td></tr><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="12a7a82b-9047-4911-b95c-e549b94d78f5"><code>address.zip</code></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="58ecff15-8542-49c1-9e4b-144bb8813833">string</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="bdd0258a-2327-4378-a21d-3cb9e38700ae">nein</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="db5130d7-5f58-4422-951a-0c38aaa4d6e8">Postleitzahl</p></td></tr><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="30958e76-6c9c-4963-90a7-e191d130bc1c"><code>address.city</code></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="e7a74590-3f99-4034-ad87-9afe2bc75991">string</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="3e476a43-10b0-4861-a517-b989d95710a2">nein</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="0e3be6aa-9464-4e21-908d-c477923d1b9c">Stadt</p></td></tr></tbody></table>

#### `building` **(Gebäudedaten)**

Parameter

Typ

Pflicht

Beschreibung

<table data-id="c44f7964-5281-4560-8482-e94c04827c6b" style="min-width: 100px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18);"><p data-id="6e8ae331-6627-4d88-9041-af74d8ab2e6d"><code>address.street</code></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18);"><p data-id="f7f415b8-d087-4163-839a-5028229f1340">string</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18);"><p data-id="968fa356-af1e-4e96-b6ea-1ba825d29fab"><strong>ja</strong></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18);"><p data-id="2f8c3210-7563-4a3c-a015-d1b1b7b86224">Straße des Gebäudes</p></td></tr><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="2ee5cffb-9904-4a50-9df5-8f972bb95e58"><code>address.houseNumber</code></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="8f8082c0-efe0-4d40-8927-5ca5242936e8">string</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="d71f82f3-f747-42cc-9e35-0ce18adef9f6"><strong>ja</strong></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="77d6e8c4-48cd-430e-9bd0-af63b7599bf6">Hausnummer des Gebäudes</p></td></tr><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="dbfe6668-d6ed-451f-aa52-a85486a6e693"><code>address.zip</code></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="905ec55e-9980-48d7-ad22-419cf207ea0b">string</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="51677722-b1a3-476f-8dca-70abe3e8dc70"><strong>ja</strong></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="933d92cf-87ac-407a-a718-b231daa616b4">Postleitzahl des Gebäudes</p></td></tr><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="f8118373-82f8-4331-8ede-f1c56a6fe3bb"><code>address.city</code></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="8211caf5-ce36-48e6-85fb-6dbffe8a94c1">string</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="b26af86d-b6f8-4da3-a04d-2026fe6069c3"><strong>ja</strong></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="82bee1cb-69bb-46ab-90ff-189d5fcb5998">Stadt des Gebäudes</p></td></tr><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="e4d9b8b8-199d-4fa5-b89d-c1e47e05fba5"><code>yearOfCompletion</code></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="dbf8fe59-12b3-49c9-99e8-1e8cafcb74a1">number</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="5b69f84b-cf84-4fee-8bb0-efb06be172f2">nein</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="e1eea343-f4ff-47b1-b588-5f44b51adf46">Baujahr des Gebäudes (z. B. <code>1990</code>)</p></td></tr><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="154365b7-94c8-4e0b-9d8b-4be0caa45c70"><code>numberOfPartiesInBuilding</code></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="03ed09ae-6942-4773-a3bd-28e84c376ec3">number</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="b53f2fb2-d67a-40c7-b8c3-d8bb65a00796">nein</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="8acd0855-26bc-43b6-acf6-acbeda74002e">Anzahl der Wohneinheiten im Gebäude</p></td></tr><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="56ca53d9-a1bd-4ac5-9151-ad5272ba4046"><code>numberOfFloors</code></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="1c4e37de-7136-42bb-9246-ecb3fae186f4">number</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="fddf98d6-3af9-4662-a286-fdf609f830bc">nein</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="c358898a-f30b-46e1-85d3-812675c27cae">Anzahl der Stockwerke</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="b1d997f6-491e-4737-ab02-d3ed05397423"><code>livingArea</code></p></td><td colspan="1" rowspan="1"><p data-id="2babeaa8-aa6c-40f9-bb0d-20abe98766ae">number</p></td><td colspan="1" rowspan="1"><p data-id="90b397e2-29a1-468f-8e29-3b1fdb47ba16"><span style="color: rgb(26, 26, 26);">nein <em>(</em></span><em><span data-name="new" data-type="emoji">🆕</span></em><span style="color: rgb(26, 26, 26);"><em> V2)</em></span></p></td><td colspan="1" rowspan="1"><p data-id="3f6df65b-20a0-4419-a9cf-33920cf5858f"><span style="color: rgb(26, 26, 26);">Wohnfläche des Gebäudes in m², als ganze Zahl (z. B. </span><code>145</code><span style="color: rgb(26, 26, 26);">). Wird ohne eigene Validierung übernommen - Dezimalwerte führen zu einem Fehler.</span></p></td></tr><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="ff8821d6-8e33-41ae-8449-295d3b3f63b5"><code>usageType</code></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="86e8ce9b-c96b-4e85-9ddb-5e70474ee8ef">enum</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="38468818-f0f1-440c-afd1-a42a1d4f2b24">nein</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="08c2a921-5741-44f8-b240-b0ec12d21211">Primärer Gebäudetyp (siehe Enum <code>BuildingType</code>)</p></td></tr><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="6471c2a7-dfe9-4c6b-b046-7b1886981006"><code>usageKind</code></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="f52ed38c-4007-4c37-8d31-833fbd763d3d">enum</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="36a66dce-922f-44fa-94a4-dd8ab338dbca">nein</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="75efe1a6-0bef-4d0f-a2a9-f16a02677401">Nutzungsart des Gebäudes (siehe Enum <code>UsageKindType</code>)</p></td></tr><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="62f84707-6b5a-40f2-93bb-f7982d930d0f"><code>latitude</code></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="2b371e63-ae44-435a-803c-7965cbe9091a">string</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="203997ea-c7a2-47a0-9584-e1961e69d48e">nein</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="88a25b95-75d2-40c5-881b-4a805afaa616">Breitengrad (z. B. <code>"52.520008"</code>)</p></td></tr><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="bbf875a1-599d-48bd-a194-050beaa53646"><code>longitude</code></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="b6fc240c-e1e3-4eb8-8b8d-89458523f1aa">string</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="12f5a5b8-de15-46d8-9cc0-556bfd02c379">nein</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="88cba63e-e0d2-4713-a8b9-3e4d94215958">Längengrad (z. B. <code>"13.404954"</code>)</p></td></tr></tbody></table>

### **Enum-Werte**

#### **Enum** `ProjectState` **(Feld:** `state`**)**

Wert

Bedeutung

Frontend-Label (sichtbar)

<table data-id="c19d0e1e-be52-4333-beac-01811b418f99" style="min-width: 75px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18);"><p data-id="46de4fd7-0ac0-492c-aa39-a2ea455126e5"><code>ACTIVE</code></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18);"><p data-id="8d410f1d-9658-4649-8e77-c5542e9018b5">Aktives Projekt (Standard)</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18);"><p data-id="1c1c2893-5605-4e50-8a1a-bf00042ec6bc"><code>Aktiv (wartend und in Arbeit)</code></p></td></tr><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="c34a83f7-7b22-458d-95d1-7a39d6dd2fc1"><code>ARCHIVED</code></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="e8ce8592-45ed-4e0f-a97e-c2e79dcf0d1e">Archiviert</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="c6398716-a677-44e0-a485-53ea1fd3d19f"><code>Abgeschlossen</code> (teilweise auch <code>Archiviert</code> je nach Ansicht)</p></td></tr><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="7c5f9ae9-8411-44b8-8aeb-2de1a55cb10c"><code>CANCELED</code></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="88510189-334c-488a-8438-5b5cf88e842e">Storniert</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="274daec4-2530-4876-965a-67b04dde3fb6"><code>Abgebrochen</code></p></td></tr><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="9762585a-f9ea-4548-a86d-6a45d5cbc183"><code>LEAD</code></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="acff6b22-cb83-4ac1-b5ca-e255ad4359a9">Lead</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="801b1a18-7a3e-432c-a1d8-f8b36a44725b"><code>Lead</code></p></td></tr></tbody></table>

> 🆕 **V2-Unterschied:** `TEMPLATE` und `SYSTEM_TEMPLATE` sind über die API **nicht erlaubt** (HTTP 400 mit `field: "state"`). Templates müssen ausschließlich innerhalb der App angelegt werden.

#### **Enum** `ContactType` **(Feld:** `client.type`**)**

Wert

Bedeutung

Frontend-Label (sichtbar)

<table data-id="fe44774f-2096-4a71-ad3a-5cc063e9245d" style="min-width: 75px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18);"><p data-id="77cb4ef0-dcdf-4cfc-9e76-82899e8eae07"><code>PERSON</code></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18);"><p data-id="6e5114dc-c2a3-46ff-9bd4-4856be43e43e">Natürliche Person</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18);"><p data-id="cf398a8e-a1b5-42b4-9799-e3d6ea21b6cc"><code>Privatperson</code></p></td></tr><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="2d81b43d-668c-41cf-92d5-3885fa1dea6c"><code>COMPANY</code></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="4d94b401-963e-482d-8161-203d9fb79d74">Unternehmen / juristische Person</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="702cfdad-6df0-407f-89d8-cf0233abeb2f"><code>Unternehmen</code></p></td></tr><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="6bb7dedf-4caf-498f-b786-27c550087648"><code>WEG</code></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="a024909c-990a-49d8-ae21-7960053dd178">Wohnungseigentümergemeinschaft</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="bf80b091-659d-4318-884d-deb3fd73c572"><code>WEG</code></p></td></tr></tbody></table>

#### **Enum** `BuildingType` **(Feld:** `building.usageType`**)**

Wert

Bedeutung

Frontend-Label (sichtbar)

<table data-id="f8ece10a-7a45-4b40-87eb-165a57345670" style="min-width: 75px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18);"><p data-id="d051a6f8-bec6-4872-b2d0-97426d22d0f0"><code>RESIDENTIAL</code></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18);"><p data-id="22a3566b-fbfa-4ca4-a9bd-04bec2e9be06">Wohngebäude</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18);"><p data-id="cab1b2e7-c4dc-4837-820a-ae1cab40782c"><code>Wohngebäude</code></p></td></tr><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="54d13b1d-361f-499e-afc3-10be1ca946ac"><code>NONRESIDENTIAL</code></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="bdb43ec7-5b1a-4044-a4f0-5c96883e8c9e">Nichtwohngebäude</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="a0545500-96b5-4754-9810-bfcdfbb590e1"><code>Nicht-Wohngebäude</code></p></td></tr><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="0b04eb4e-b760-4235-8bc9-0f99f136a218"><code>MIXED</code></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="f0c4309d-ed63-4877-af1a-a42dd8907f0c">Mischgebäude (Wohn- und Nichtwohnnutzung)</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="45ad91df-3562-41c2-831d-76cfc90e59f9"><code>Mischgebäude</code></p></td></tr></tbody></table>

#### **Enum** `UsageKindType` **(Feld:** `building.usageKind`**)**

Wert

Bedeutung

Frontend-Label (sichtbar)

<table data-id="2c362c6f-902b-44ea-80a0-091e6469f9a3" style="min-width: 75px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18);"><p data-id="6f76c7e6-7f11-42cb-860a-cdbfd9fef7c2"><code>LEASED_BUILDING</code></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18);"><p data-id="f1da0c6c-7043-4fd3-b1ab-b0f92466752f">Vermietung</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18);"><p data-id="c1e2a71c-9c46-4595-b016-48b3b0700433"><code>Vermietung (ausschließlich)</code></p></td></tr><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="a1b5f08f-529f-40b5-b5a3-1eb631b31f38"><code>OWNER_OCCUPIED_BUILDING</code></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="128b00e0-f0f9-4b6b-8afd-19ff1d1e8655">Eigennutzung</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="704c7247-5404-48b1-b05e-d57f2dfe47cf"><code>Eigennutzung (ausschließlich)</code></p></td></tr><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="9a636576-8ab4-45f7-943e-3d4fb89e95e2"><code>MIXED_SELFUSE_LEASED</code></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="8a6a9c5a-e202-4698-b24c-e71c46dfad45">Gemischte Nutzung (Eigennutzung und Vermietung)</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="4330b986-ef35-4ebb-a062-6ebd18230765"><code>Eigennutzung und Vermietung</code></p></td></tr></tbody></table>

### **Pflichtfelder**

Die folgenden Felder sind zwingend erforderlich:

-   `client.lastName`
    
-   `building.address.street`
    
-   `building.address.houseNumber`
    
-   `building.address.zip`
    
-   `building.address.city`
    

UUID-Format-Prüfung (HTTP 400 bei Verletzung):

-   `data.templateId`
    
-   `data.client.contactId`
    

### **Beispiel-Request-Body**

```json
{
  "data": {
    "client": {
      "firstName": "Max",
      "lastName": "Mustermann",
      "email": "max@beispiel.de",
      "phone": "+49 123 456789",
      "mobile": "+49 170 1234567",
      "type": "PERSON",
      "salutation": "Sehr geehrter"
    },
    "building": {
      "address": {
        "street": "Musterstraße",
        "houseNumber": "42",
        "zip": "12345",
        "city": "Berlin"
      },
      "yearOfCompletion": 1990,
      "numberOfFloors": 3,
      "livingArea": 145,
      "usageType": "RESIDENTIAL",
      "usageKind": "OWNER_OCCUPIED_BUILDING",
      "latitude": "52.520008",
      "longitude": "13.404954"
    },
    "reference": "WEB-2026-001",
    "note": "Importiert via Website",
    "state": "ACTIVE",
    "templateId": "123e4567-e89b-12d3-a456-426614174000"
  }
}
```

## **Response**

### **Erfolgreiche Antwort (HTTP 200)** 🆕 **_erweitert in V2_**

```json
{
  "message": "Project created successfully",
  "projectId": "8f3a…",
  "contactId": "1c4b…",
  "buildingId": "2d9e…",
  "contactAction": "linked",
  "buildingAction": "created"
}
```

Feld

Bedeutung

<table data-id="7e9bc748-eb66-4fdf-a37a-b9e803d4fb80" style="min-width: 50px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18);"><p data-id="8c2de639-6d8b-4ee4-9a62-5b7aa3f98bea"><code>projectId</code></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18);"><p data-id="4ed0dcc2-6cbe-46f5-8885-2d356c55e2cd">UUID des neu erstellten Projekts</p></td></tr><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="e13c4a50-cb8a-4f2f-b496-30cc312eead7"><code>contactId</code></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="3976909b-0742-4fee-b552-443e374bfcf9">UUID des verknüpften oder neu angelegten Kontakts</p></td></tr><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="796d0ec8-92e9-455f-870b-7840394ff675"><code>buildingId</code></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="90a7486c-9e17-4743-ae1b-f54d6f472930">UUID des verknüpften oder neu angelegten Gebäudes</p></td></tr><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="12bc3ba2-b45e-4ac0-a077-eb966ad2597e"><code>contactAction</code></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="ec600511-fef5-45f9-a509-919f521dd802"><code>"created"</code> (neu angelegt) oder <code>"linked"</code> (existierender Kontakt verknüpft)</p></td></tr><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="72fade86-abe5-4ac7-8976-70e8e150ee05"><code>buildingAction</code></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="0947f187-61b2-40fc-94d4-646a56fa5091"><code>"created"</code> (neu angelegt) oder <code>"linked"</code> (existierendes Gebäude verknüpft, gleiche Adresse vorhanden)</p></td></tr></tbody></table>

### **Fehlerhafte Authentifizierung (HTTP 401)**

```json
{ "error": "Unauthorized" }
```

### **Feature-Flag fehlt (HTTP 403)** 🆕 **_V2_**

```json
{
  "error": {
    "message": "Die addProject API ist für diese Organisation noch nicht freigeschaltet. Bitte aktiviere die Beta-Funktion unter Einstellungen → Im-/Export & Vorschau."
  }
}
```

### **Validierungsfehler (HTTP 400)** 🆕 **_strukturierter in V2_**

V2 liefert eine **Liste aller Validierungsfehler gleichzeitig** zurück, jeweils mit `field` und `message`:

```json
{
  "error": {
    "message": "Missing or invalid fields",
    "fields": [
      { "field": "client.lastName", "message": "Pflichtfeld fehlt" },
      {
        "field": "building.usageType",
        "message": "Ungültiger Wert. Erlaubt: RESIDENTIAL, NONRESIDENTIAL, MIXED"
      }
    ]
  }
}
```

### **Kontakt nicht gefunden (HTTP 404)** 🆕 **_V2_**

Wird gesendet, wenn `client.contactId` angegeben ist, aber kein Kontakt mit dieser ID in der Organisation existiert:

```json
{
  "error": {
    "message": "Kontakt mit der ID \"<id>\" wurde in dieser Organisation nicht gefunden."
  }
}
```

### **Mehrdeutige Kontaktauflösung (HTTP 409)** 🆕 **_V2_**

Wird gesendet, wenn das Field-Matching mehr als einen Kontakt findet. Der Aufrufer muss `client.contactId` setzen, um den gewünschten Kontakt eindeutig zu identifizieren:

```json
{
  "error": "conflict",
  "message": "Es wurden 3 Kontakte mit den übermittelten Daten gefunden. Übergib client.contactId um den gewünschten Kontakt eindeutig zu identifizieren. Die gefundenen Kandidaten stehen im Feld candidates.",
  "candidates": [
    { "contactId": "8f3a…" },
    { "contactId": "1c4b…" },
    { "contactId": "2d9e…" }
  ]
}
```

### **Fehler beim Import (HTTP 500)**

```json
{ "error": "<Fehlermeldung>" }
```

## **Technische Details**

### **Funktionsablauf (V2)**

1.  **Token-Validierung** – `decodeJwt()` prüft Signatur und JTI-Hash. Bei ungültigem oder widerrufenem Token: HTTP 401.
    
2.  **Feature-Flag-Guard** – `hasFeatureFlagForOrg('showAddProjectV2', organizationId)`. Ohne Flag: HTTP 403.
    
3.  **Eingabe-Validierung** – `validateInput()` sammelt **alle** Fehler und gibt sie als Liste zurück (HTTP 400).
    
4.  **Projekttyp-Bestimmung** – `resolveProjectType()`: explizites `data.type` → `templateId.type` → Standard `"Anfrage/Angebot"`.
    
5.  **Kontaktauflösung** – `resolveContact()` (siehe nächster Abschnitt).
    
6.  **Gebäudeauflösung** – `resolveBuilding()` legt entweder ein neues Gebäude an oder verknüpft ein vorhandenes mit identischer Adresse.
    
7.  **Projekt-Erstellung** – `createProject()` ruft `createProjectInOrga` auf und setzt anschließend `note`. Eine fehlende Vorlage mit Referenz `"Anfrage/Angebot"` (oder dem angegebenen Typ) führt zu einem 500-Fehler mit klarer Anleitung.
    
8.  **Aktivitäts-Log** – `queuelogActivity` schreibt einen Erfolgs-Eintrag und benachrichtigt den Token-Owner.
    
9.  **Fehlerbehandlung** – Bei Ausnahmen wird zusätzlich eine E-Mail an den Token-Owner mit Fehlermeldung und übermittelten Daten gesendet.
    

### **Kontaktauflösung (**`resolveContact`**)** 🆕 **_V2_**

Die V2-Logik verknüpft existierende Kontakte automatisch, statt bei jedem Import einen neuen Kontakt anzulegen:

1.  **Explizite** `contactId` → Kontakt wird direkt verknüpft (`contactAction: "linked"`). Existiert die ID nicht in der Organisation, wird HTTP 404 zurückgegeben.
    
2.  **Field-Matching** (greift, sobald mindestens eines der Felder `firstName`, `email`, `phone`, `mobile` oder `companyName` übergeben wurde):
    
    -   Genau **1 Treffer** → `contactAction: "linked"`
        
    -   **Mehrere Treffer** → HTTP 409 (Conflict) mit Kandidatenliste
        
    -   **Kein Treffer** → neuen Kontakt anlegen (`contactAction: "created"`)
        
3.  **Nur** `lastName` (kein weiteres Match-Feld) → Matching wird übersprungen, es wird **immer** ein neuer Kontakt angelegt.
    

### **Auto-Referenz-Generierung** 🆕 **_V2_**

Wenn `data.reference` bzw. `client.reference` leer sind:

-   Projekt-Referenz: `getNextProjectReference(organizationId)` – inkrementiert die Nummer der zuletzt nach `createdAt` angelegten Projekt-Referenz; Fallback `0001`.
    
-   Kontakt-Referenz (nur bei Neuanlage): `getNextContactReference(organizationId)` – analog, basierend auf der zuletzt angelegten Kontakt-Referenz; Fallback `0001`.
    

Bei parallelen Anfragen kann es kurzzeitig zu doppelten Referenzen kommen, da die Zähler nicht datenbankseitig gesperrt werden. Die Eindeutigkeit ist also keine harte Garantie – das gleiche Verhalten gilt auch für die Auto-Vervollständigung im Frontend.

### **Beispiel-Aufruf**

```bash
curl -X POST "https://eba-api.azurewebsites.net/v2/projects?token=eyJhbGc..." \
  -H "Content-Type: application/json" \
  -d '{
    "data": {
      "client": {
        "firstName": "Max",
        "lastName": "Mustermann",
        "email": "max@beispiel.de",
        "phone": "+49 123 456789",
        "type": "PERSON",
        "salutation": "Sehr geehrter"
      },
      "building": {
        "address": {
          "street": "Musterstraße",
          "houseNumber": "42",
          "zip": "12345",
          "city": "Berlin"
        },
        "yearOfCompletion": 1990,
        "numberOfFloors": 3,
        "livingArea": 145,
        "usageType": "RESIDENTIAL",
        "usageKind": "OWNER_OCCUPIED_BUILDING",
        "latitude": "52.520008",
        "longitude": "13.404954"
      },
      "note": "Import von Website-Formular",
      "reference": "WEB-2026-001",
      "state": "ACTIVE"
    }
  }'
```

## **Fehlerbehandlung**

### **Häufige Fehlerszenarien**

1.  **Ungültiges oder widerrufenes Token** – Überprüfe, ob das Token korrekt generiert und nicht widerrufen wurde (Einstellungen → Im-/Export & Vorschau).
    
2.  **Feature-Flag inaktiv** – Bei HTTP 403 das Beta-Flag `addProject Public API` selbst aktivieren unter [Einstellungen → Im-/Export & Vorschau](https://app.grundsteine.com/settings?tab=features).
    
3.  **Validierungsfehler** – HTTP 400 mit Feldliste; alle Verstöße werden auf einmal zurückgegeben.
    
4.  **Mehrdeutige Kontakte** – HTTP 409 mit Kandidaten; aufrufendes System sollte `client.contactId` setzen.
    
5.  **Kontakt nicht gefunden** – HTTP 404, wenn die übergebene `client.contactId` nicht zur Organisation gehört.
    
6.  **Fehlende** `Anfrage/Angebot`**\-Vorlage** – HTTP 500 mit Hinweis, dass eine Template-Vorlage mit Referenz `"Anfrage/Angebot"` benötigt wird oder ein expliziter `type` / `templateId` übergeben werden muss.
    

### **E-Mail-Benachrichtigung bei Fehlern**

Bei serverseitigen Importfehlern (HTTP 500) wird automatisch eine E-Mail an den Token-Owner gesendet. Diese E-Mail enthält:

-   Eine benutzerfreundliche Fehlerbeschreibung
    
-   Die vollständigen übermittelten Daten zur Fehleranalyse
    
-   Kontaktinformationen für den Support
    

## **Unterschiede zu V1**

Bereich

V1 (`/v1/projects`)

V2 (`/v2/projects`, Beta)

<table data-id="990cdd63-21b5-4c47-9ecb-e2d7c23496d0" style="min-width: 75px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18);"><p data-id="6f6ad0c9-14ca-40b5-be36-ee0c271d33c6"><strong>Pfad</strong></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18);"><p data-id="d8b82aa4-4c4c-47e3-80c7-a0fbe5f9960c"><code>/addProject</code> bzw. <code>/v1/projects</code></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18);"><p data-id="549d4b22-de9e-405e-8dbe-580a2f859913"><code>/v2/projects</code></p></td></tr><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="04c1fd5a-5c46-4606-9a2d-9c8197588942"><strong>Status</strong></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="f757ab34-483b-4885-9f04-62fdfcaa2d27">Stabil, parallel verfügbar</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="f411e7e0-8897-4159-8b75-717244050027">Beta hinter <code>showAddProjectV2</code></p></td></tr><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="c44f8253-5542-40f0-830f-a8ca3d41061b"><strong>Feature-Flag</strong></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="ea188207-0cb2-4cef-bb2f-4282f5ee2317">– (immer aktiv, sofern Token freigeschaltet)</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="86bbe384-5b94-4a75-b85e-4b0c4e7c50c1"><code>showAddProjectV2</code> (Beta) – ohne Flag HTTP 403</p></td></tr><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="a4b5b284-38e0-4a9a-be0e-6b32bdc7fa0c"><strong>Token-Widerruf</strong></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="765d990c-6530-403f-a931-5f821341d0f3">Schwächere Garantien</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="30025cb9-99d5-4241-89e8-f1c345a948c4">Widerrufene Tokens sind sofort und dauerhaft ungültig und können nicht reaktiviert werden</p></td></tr><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="5ff94808-8d7b-47cb-901f-e7273eb433e8"><strong>Kontaktauflösung</strong></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="905a8200-a614-4435-a975-17a1ef4c9708">Immer neuer Kontakt</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="0b6f6785-b2eb-453f-8a50-7966cb91234f">Smart: <code>contactId</code> → Field-Matching → Neu-Anlage; Konflikte werden mit HTTP 409 + Kandidatenliste zurückgegeben</p></td></tr><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="61ed2789-8216-4290-bf5f-b7ab937ce4ea"><code>client.contactId</code></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="ad8113c1-914d-4cba-929d-1a3e657541e5">Nicht unterstützt</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="e1b7e401-88d0-4f40-abed-3ffd8cd00c58">Optional, UUID; verknüpft direkt mit existierendem Kontakt</p></td></tr><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="50eac863-2655-41de-b3ae-a97d9fd879e0"><code>client.mobile</code></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="219c9a24-ee7d-462c-b2b9-24b32c732b9c">Nicht unterstützt</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="9048e7cd-00c2-44c3-8440-d549c98c7b2e">Unterstützt (auch für Field-Matching)</p></td></tr><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="a2537b8f-b389-4b5c-8f79-5188b3d4a03b"><code>client.reference</code></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="93343371-1797-402f-9aa6-138ec5a036b0">Nicht unterstützt</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="2c8eeba7-ad77-4757-a050-b446c66ca475">Optional; bei Neuanlage; Auto-Generierung wenn leer</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="e327cb81-d798-46e8-bd37-4279a7613254"><code>building.livingArea</code></p></td><td colspan="1" rowspan="1"><p data-id="d5e5d1ad-5112-42ff-b8d0-917c088e2634"><span style="color: rgb(26, 26, 26);">Nicht unterstützt</span></p></td><td colspan="1" rowspan="1"><p data-id="1bda1dd3-7303-46d5-9397-646cadc48dc9"><span style="color: rgb(26, 26, 26);">Optional; Wohnfläche in m² (ganze Zahl)</span></p></td></tr><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="a0247011-8e37-457c-9ea5-40981d2580e8"><code>data.reference</code></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="37c022db-8ad7-4ead-ba05-870de85d17b2">Pflicht/Default <code>"WEBSITE"</code></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="0b3c2e06-bcdb-4973-9878-4748529dd481">Optional; Auto-Generierung (<code>getNextProjectReference</code>) wenn leer</p></td></tr><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="443285f8-a0b7-46b9-a688-fb90a07bf7a9"><code>data.state</code></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="14823d98-fec4-4ff7-be26-b31c91beb3a7">Beliebiger <code>ProjectState</code>-Wert</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="18c56fca-cb2a-420f-b01d-d975004c6b11">Eingeschränkt auf <code>ACTIVE</code>, <code>ARCHIVED</code>, <code>CANCELED</code>, <code>LEAD</code> – <code>TEMPLATE</code>/<code>SYSTEM_TEMPLATE</code> sind verboten</p></td></tr><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="0f48d0da-a14e-4e1d-ba97-5f7644d12fca"><strong>Validierung</strong></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="b29c8bc1-9c64-4937-95fe-e23e055ec96c">Erste Verletzung → 400 mit Sammeltext</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="3dd686c8-e85a-45f7-801c-38411d6d37cc">Alle Verletzungen gleichzeitig als strukturierte Liste <code>[{ field, message }]</code></p></td></tr><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="bb133e30-9620-40c2-b8d7-a608f139d45a"><strong>Validierungsformat</strong></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="f6005e44-37ae-4334-8a4e-3a290567b739"><code>{ "error": { "message": "Missing or invalid mandatory fields: ..." } }</code></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="599c25fc-c18a-4307-bd92-b4843c95d164"><code>{ "error": { "message": "Missing or invalid fields", "fields": [{ "field": "...", "message": "..." }] } }</code></p></td></tr><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="eeb11c27-471e-43b3-abdb-8d50cdeb757d"><strong>Erfolgs-Response</strong></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="98ec5049-62f7-48fe-868e-1da77be90eeb"><code>{ "message": "Project added successfully" }</code></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="b95d14a8-5cf1-442b-ab8f-b0a363eb6fd0"><code>{ "message": "Project created successfully", "projectId": "...", "contactId": "...", "buildingId": "...", "contactAction": "...", "buildingAction": "..." }</code></p></td></tr><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="72e69f71-aa48-42b2-843e-c977ad31ae56"><strong>Gebäude-Auflösung</strong></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="9366ec97-a3ae-4fa0-b8cd-6bb76f122696">Adressbasiert, ohne Rückmeldung</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="4f7606bc-9332-4f65-925a-5d7ec8b546d3">Adressbasiert, mit <code>buildingAction</code> (<code>"created"</code> oder <code>"linked"</code>) in der Response</p></td></tr><tr><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="aa17275c-8892-4486-a226-7c4b6563b61d"><strong>Aktivitäts-Log</strong></p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="90ed7a78-96bd-4a74-9c1a-43b36f9a1d4d">Vorhanden</p></td><td colspan="1" rowspan="1" style="padding: 5px 10px; border-color: rgba(0, 0, 0, 0.18); border-top-width: 1px; border-top-style: solid;"><p data-id="5b10a24c-8f12-4a4f-81a5-2ef02aa86c53">Vorhanden – inkl. Benachrichtigung an den Token-Owner</p></td></tr></tbody></table>

## **Wartung und Support**

Bei Fragen zur Integration oder Problemen mit der API-Funktion erreichst du uns über den **Support-Chat** in der Anwendung. Das Beta-Feature-Flag `addProject Public API` kannst du selbst aktivieren unter [Einstellungen → Im-/Export & Vorschau](https://app.grundsteine.com/settings?tab=features). Für die Freischaltung eines neuen Tokens wende dich bitte ebenfalls an den Support-Chat.
