Entwickler · REST-API v1

    Die Structify-API

    Holen Sie Projekte, Mängel, Protokolle und Dateiangaben aus Structify in Ihre eigenen Systeme – und legen Sie Mängel aus Ihren Systemen an. Diese Seite beschreibt genau den Umfang, den die Schnittstelle heute bietet.

    Stand 09.10.2026 · Version v1

    Überblick

    Die Structify-API ist eine REST-Schnittstelle: Sie senden HTTPS-Anfragen und erhalten JSON zurück. Jeder API-Schlüssel gehört zu genau einer Organisation und erreicht ausschließlich deren Daten.

    Protokoll
    HTTPS, Anfragen und Antworten als JSON (UTF-8)
    Version
    v1 – steht im Pfad jeder Anfrage
    Anmeldung
    API-Schlüssel im Kopfzeilenfeld X-Api-Key
    Bereiche
    Projekte, Mängel, Protokolle, Angaben zu Projektdateien, Webhooks; dazu Alteinträge des früheren Bautagebuchs
    Grenze
    1.000 Anfragen pro Stunde je Schlüssel

    Hinweis Nur, was heute geht.

    Diese Dokumentation beschreibt ausschließlich Funktionen, die heute verfügbar sind. Was (noch) fehlt, steht offen im Abschnitt „Was die API heute nicht kann“.

    Zugang & Berechtigungen

    Für die Anbindung brauchen Sie einen API-Schlüssel, den Ihre Geschäftsführung in der Web-App anlegt: Einstellungen → Integrationen → API & Drittanbieter.

    Wichtig Nur die Geschäftsführung verwaltet Schlüssel.

    API-Schlüssel und Webhooks legen in der Web-App ausschließlich Mitglieder der Geschäftsführung an; dort deaktivieren sie auch Schlüssel und löschen Webhooks. Ein Schlüssel gilt nur, solange die Person, die ihn angelegt hat, aktives Mitglied der Geschäftsführung Ihrer Organisation ist. Scheidet sie aus oder wechselt sie die Rolle, ist der Schlüssel sofort wirkungslos.

    Achtung Ein Schlüssel wirkt organisationsweit.

    Ein Schlüssel ist nicht auf Projekte oder die Rechte einzelner Personen beschränkt: Er erreicht alle Projekte Ihrer Organisation in den Bereichen, die die API anbietet – unabhängig von Projektmitgliedschaften. Der Einzelabruf eines Projekts oder Mangels liefert dabei alle gespeicherten Felder, auch Honorar-, Budget- und Abrechnungsangaben, Ansprechpartner der Bauherrschaft, interne Notizen und Kontaktangaben (siehe „Verfügbare Endpunkte“). Vergeben Sie Schlüssel deshalb sparsam und nur für Systeme, denen Sie diese Daten anvertrauen.

    Rechte eines Schlüssels

    Beim Anlegen wählen Sie, was der Schlüssel darf. Der Server prüft diese Rechte bei jeder Anfrage:

    Rechte eines API-Schlüssels und was sie freischalten
    RechtSchaltet frei
    Jeder gültige SchlüsselProjekte, Mängel, Protokolle und Alteinträge des früheren Bautagebuchs lesen; Webhooks auflisten und löschen
    Lesen oder Dokumente lesenAngaben zu Projektdateien abrufen
    Tickets schreibenMängel anlegen und ändern; Webhooks registrieren

    Die in der Oberfläche angebotene Auswahl „Rechnungen exportieren“ schaltet heute keinen Endpunkt frei.

    Authentifizierung

    Senden Sie den Schlüssel bei jeder Anfrage im Kopfzeilenfeld X-Api-Key. Alternativ nimmt die API ihn als Bearer-Token im Feld Authorization an.

    Kopfzeile
    X-Api-Key: <IHR_API_SCHLUESSEL>

    Alternative Kopfzeile
    Authorization: Bearer <IHR_API_SCHLUESSEL>

    • Schlüssel beginnen mit sk_. Structify zeigt einen Schlüssel nur einmal – direkt nach dem Anlegen. Kopieren Sie ihn dann sofort.
    • Gespeichert werden nur ein Prüfwert (SHA-256) und die ersten Zeichen zur Wiedererkennung, nicht der Schlüssel selbst. Deshalb kann ihn niemand nachträglich vollständig anzeigen; bei Verlust legen Sie einen neuen an und deaktivieren den alten.
    • Deaktivieren Sie einen Schlüssel in den Einstellungen, ist er sofort ungültig.

    Achtung Schlüssel gehören auf den Server.

    Verwenden Sie API-Schlüssel nie in Browser- oder App-Code, nicht in Quellcode-Repositories und nicht in URLs. Hinterlegen Sie sie zum Beispiel als Umgebungsvariable Ihres Servers.

    Basis-URL

    Alle Pfade auf dieser Seite hängen Sie an diese Basis-URL an:

    Basis-URL
    https://api.structify.solutions/functions/v1/public-api

    • Beispiel: …/public-api/v1/projekte
    • Nur HTTPS. Die Version (v1) steht im Pfad.
    • Kennungen (id) sind UUIDs; Zeitpunkte stehen im ISO-8601-Format mit Zeitzone, Datumsfelder als JJJJ-MM-TT.
    • Feldnamen und Feldwerte übernimmt die API aus Structify; Fehlermeldungen sind deutsch. Ausnahme: Scheitert das Registrieren eines Webhooks an der Datenbank, kann die Meldung englischen Datenbanktext enthalten.

    Beispielanfrage

    So rufen Sie die ersten zwei Projekte Ihrer Organisation ab:

    Anfrage (cURL)
    curl "https://api.structify.solutions/functions/v1/public-api/v1/projekte?limit=2" \
      -H "X-Api-Key: <IHR_API_SCHLUESSEL>"

    Anfrage (JavaScript, Node.js 18 oder neuer)
    const response = await fetch(
      "https://api.structify.solutions/functions/v1/public-api/v1/projekte?limit=2",
      { headers: { "X-Api-Key": process.env.STRUCTIFY_API_KEY } }
    );
    const body = await response.json();
    if (!response.ok) throw new Error(`${body.status}: ${body.error}`);
    const { data, total } = body;

    Antwort 200 (gekürzt auf einen Eintrag)
    {
      "data": [
        {
          "id": "<PROJEKT_ID>",
          "project_name": "Neubau Bürogebäude Musterstraße",
          "project_number": "2026-014",
          "client_id": "<KUNDEN_ID>",
          "clients": {
            "name": "Muster GmbH"
          },
          "project_type": "Neubau",
          "current_phase": "LP5",
          "status": "aktiv",
          "priority": "normal",
          "construction_start": "2026-03-02",
          "construction_end": "2027-06-30",
          "created_at": "2026-01-15T09:12:44.512+00:00"
        }
      ],
      "total": 12,
      "limit": 2,
      "offset": 0
    }

    Listen liefern data (Einträge), total (Gesamtzahl der Treffer), limit und offset – mit einer Ausnahme: GET /v1/webhooks liefert nur data. Einzelabrufe liefern data mit allen Feldern des Datensatzes.

    Verfügbare Endpunkte

    Diese Endpunkte funktionieren heute. Pfade relativ zur Basis-URL; {id} steht für die Kennung des Datensatzes.

    Endpunkte der Structify-API v1
    EndpunktZweckRecht
    GET /v1/projekteProjekte auflistenjeder gültige Schlüssel
    GET /v1/projekte/{id}Ein Projekt mit allen Feldernjeder gültige Schlüssel
    GET /v1/ticketsMängel auflistenjeder gültige Schlüssel
    GET /v1/tickets/{id}Einen Mangel mit allen Feldernjeder gültige Schlüssel
    POST /v1/ticketsMangel anlegenTickets schreiben
    PUT /v1/tickets/{id}Mangel ändern (zum Beispiel Status)Tickets schreiben
    GET /v1/protokolleProtokolle auflistenjeder gültige Schlüssel
    GET /v1/bautagebuchAlteinträge des früheren Bautagebuchs auflistenjeder gültige Schlüssel
    GET /v1/dokumenteAngaben zu Projektdateien auflistenLesen oder Dokumente lesen
    GET /v1/webhooksWebhooks auflistenjeder gültige Schlüssel
    POST /v1/webhooksWebhook registrierenTickets schreiben
    DELETE /v1/webhooks/{id}Webhook löschenjeder gültige Schlüssel

    Wichtig Mängel, Protokolle und Bautagebuch – welche Daten gemeint sind.

    Der Pfad /v1/tickets arbeitet mit den Mängeln aus dem Projektbereich „Mangelmanagement“. Einträge aus „Projekttickets“ und Gewährleistungsmängel aus „Gewährleistungsmangel“ erreicht die API heute nicht. /v1/protokolle liefert nur die Protokolle und Berichte aus dem Dokumentenassistenten (Seite „Dokumente“ → „Neues Dokument“). Nicht enthalten sind Dokumente aus Vorlagen im Projektbereich „Protokolle und Formulare“ – auch wenn der Knopf dort ebenfalls „Neues Dokument“ heißt – und die Gesprächsprotokolle aus „Grundlagenermittlung“, „Planungsgespräch“ und „Baustellengespräch“. /v1/bautagebuch liefert nur Alteinträge des früheren Bautagebuch-Bereichs, für den es heute keinen Erfassungsweg mehr gibt. Bautagebuch-Einträge, die Sie heute als Projektticket der Art „Bautagebuch-Eintrag“ anlegen, gehören zu den „Projekttickets“ und sind nicht enthalten.

    Hinweis Kurzübersicht unter GET /v1.

    GET /v1 liefert eine kurze Liste der Pfade. Sie nennt auch POST /v1/projekte und GET /v1/suche – beide sind heute nicht nutzbar; POST /v1/projekte antwortet heute mit 403 (siehe „Was die API heute nicht kann“).

    Projekte

    • GET /v1/projekteProjekte auflisten
    • GET /v1/projekte/{id}Ein Projekt mit allen Feldern

    Projekte lesen Sie als Liste (neueste zuerst) oder einzeln. Die Liste enthält die unten genannten Felder. Der Einzelabruf liefert dagegen alle gespeicherten Felder des Projekts – darunter Honorar-, Budget- und Abrechnungsangaben (etwa Honorare, Stundensätze, Rabatte und Rechnungsempfänger), Ansprechpartner und Anschrift der Bauherrschaft, interne Notizen und weitere hinterlegte Kontaktangaben. Anlegen und Ändern von Projekten bietet die API heute nicht an.

    Felder in der Liste
    id, project_name, project_number, client_id, clients.name (Auftraggeber), project_type, current_phase, status, priority, construction_start, construction_end, created_at
    Filter und Seiten
    status (vorbereitung, aktiv, pausiert, abgeschlossen, archiviert); limit (Standard 20, höchstens 100), offset

    Mängel (/v1/tickets)

    • GET /v1/ticketsMängel auflisten
    • GET /v1/tickets/{id}Einen Mangel mit allen Feldern
    • POST /v1/ticketsMangel anlegen
    • PUT /v1/tickets/{id}Mangel ändern (zum Beispiel Status)

    Mängel lesen Sie als Liste (neueste zuerst) oder einzeln, legen sie an und ändern sie. Der Einzelabruf liefert alle gespeicherten Felder des Mangels, darunter die Kontakt-E-Mail, die zuständige Firma und Notizen; dasselbe gilt für die Antworten auf Anlegen und Ändern und für Webhook-Nachrichten. Beim Anlegen sind building_location (Ort, Bauteil) und description Pflicht. project_id ist optional, muss aber zu Ihrer Organisation gehören. Beim Ändern bleiben id und project_id unverändert. Anlegen und Ändern liefern den gespeicherten Datensatz ohne den eingebetteten Projektnamen. Die Mangelnummer (defect_number) vergeben Sie selbst: Die API vergibt keine und prüft nicht, ob eine Nummer schon verwendet wird; ohne Angabe bleibt das Feld leer (null).

    Felder in der Liste
    id, defect_number, building_location, description, status, severity, discipline, remediation_deadline, project_id, created_at, projects.project_name
    Filter und Seiten
    status, projekt_id, severity (auch prioritaet), discipline (auch gewerk); limit (Standard 50, höchstens 100), offset
    Zulässige Werte
    • status (Standard offen): offen, in_behebung, behoben, abgenommen, verjährt
    • severity (Standard wesentlich): unwesentlich, wesentlich, erheblich, sicherheitsrelevant
    • discipline (optional): Heizung, Lüftung, Sanitär, Elektro, MSR, Sonstiges
    • remediation_deadline ist ein Datum (JJJJ-MM-TT).

    Protokolle

    • GET /v1/protokolleProtokolle auflisten

    Protokolle und Berichte aus dem Dokumentenassistenten (Seite „Dokumente“ → „Neues Dokument“) als Liste (neueste zuerst). Nur lesend. Die Art (session_type) ist eine von: Baubesprechung, Planungsbesprechung, Abnahmebegehung, Mängelbegehung, Abstimmungsgespräch, Telefonnotiz, Aktennotiz, Inbetriebnahmeprotokoll, Übergabeprotokoll.

    Felder in der Liste
    id, title, session_type, status (entwurf, in_bearbeitung, freigabe_ausstehend, freigegeben, final, versendet), created_at, projects.project_name
    Filter und Seiten
    projekt_id; limit (Standard 20, höchstens 100), offset

    Bautagebuch (früherer Bereich)

    • GET /v1/bautagebuchAlteinträge des früheren Bautagebuchs auflisten

    Alteinträge des früheren Bautagebuch-Bereichs als Liste, nach Datum absteigend. Nur lesend. Für diesen Bereich gibt es heute keinen Erfassungsweg mehr; die Liste kann deshalb leer sein. Bautagebuch-Einträge, die Sie heute als Projektticket der Art „Bautagebuch-Eintrag“ anlegen, liefert dieser Pfad nicht.

    Felder in der Liste
    id, datum, wetter_typ, temperatur_grad, freitext, taetigkeiten (Liste), arbeitskraefte (Liste mit firma, gewerk, anzahl), projects.project_name
    Filter und Seiten
    projekt_id; limit (Standard 20, höchstens 100), offset

    Projektdateien

    • GET /v1/dokumenteAngaben zu Projektdateien auflisten

    Angaben zu den Dateien im Projektbereich „Dokumentdatenbank“, neueste zuerst; gelöschte Dateien erscheinen nicht. Pläne und Fotos aus der Fotogalerie sind nicht enthalten. Die Dateien selbst lädt die API heute nicht herunter.

    Felder in der Liste
    id, dateiname, dateityp, dateigroesse, storage_path, ordner_id, projekt_id, hochgeladen_am, hochgeladen_von, projects.project_name
    Filter und Seiten
    projekt_id, ordner_id; limit (Standard 20, höchstens 100), offset

    Webhooks

    • GET /v1/webhooksWebhooks auflisten
    • POST /v1/webhooksWebhook registrieren
    • DELETE /v1/webhooks/{id}Webhook löschen

    Registrierte Webhooks auflisten, neue registrieren und löschen. Beim Registrieren sind name und url Pflicht; events ist die Liste der gewünschten Ereignisse – ohne events erhält der Webhook keine Nachrichten. Die Namen in events prüft die API nicht: Ein unbekannter Name wird gespeichert, löst aber nie eine Nachricht aus. Details im Abschnitt Webhooks.

    Felder in der Liste
    id, name, url, events, ist_aktiv, letzter_versuch, letzte_antwort
    Filter und Seiten
    keine; die Liste enthält alle Webhooks Ihrer Organisation

    Grundbegriffe

    Organisation
    Jeder Schlüssel gehört zu genau einer Organisation. Datensätze anderer Organisationen sind nicht sichtbar: Einzelabrufe mit einer fremden Kennung beantwortet die API mit 404.
    Seitenweise abrufen
    limit legt die Anzahl je Antwort fest, offset die Zahl der übersprungenen Einträge. total nennt die Gesamtzahl – so blättern Sie, bis offset + limit ≥ total.
    Sortierung
    Listen sind fest sortiert: neueste zuerst (früheres Bautagebuch nach Datum absteigend; Webhooks ohne feste Reihenfolge). Eine eigene Sortierung bietet die API nicht.
    Filter
    Filter vergleichen auf exakte Gleichheit. Ein Wert, den es nicht gibt, liefert eine leere Liste; eine ungültige Kennung in einem Filter liefert 400.
    Antworten
    Liste: data, total, limit, offset (Webhooks: nur data) · Einzelabruf: data · Anlegen und Ändern: data und message · Löschen: message.
    Methoden
    Protokolle, das frühere Bautagebuch und Projektdateien sind nur lesbar. Senden Sie dorthin nur GET: Andere Methoden weist die API dort heute nicht ab, sondern beantwortet sie wie GET mit der Liste – angelegt oder geändert wird dabei nichts.

    Ratenbegrenzung

    Je Schlüssel sind 1.000 Anfragen pro Stunde möglich. Gezählt wird über die jeweils letzten 60 Minuten – auch Anfragen, die in einem Endpunkt mit einem Fehler enden (zum Beispiel 400 oder 404).

    Kopfzeilen jeder erfolgreichen Antwort
    X-RateLimit-Limit: 1000
    X-RateLimit-Remaining: 997

    Ist die Grenze erreicht, antwortet die API mit Status 429:

    Antwort 429
    {
      "error": "Rate Limit überschritten (1000/h)",
      "status": 429
    }

    Wichtig Kein Reset-Zeitpunkt.

    Die API nennt nicht, wann die Grenze wieder frei ist, und sendet die Kopfzeilen nur bei erfolgreichen Antworten. Warten Sie nach einer 429-Antwort einige Minuten und verlängern Sie die Wartezeit bei jeder weiteren 429-Antwort.

    Fehler & Statuscodes

    Fehler, die die API selbst feststellt, beantwortet sie mit einem passenden HTTP-Status und diesem JSON:

    Antwort 401
    {
      "error": "API-Key fehlt. Header: X-Api-Key: sk_...",
      "status": 401
    }

    Maßgeblich ist der Statuscode. Der Meldungstext ist deutsch und kann sich ändern – werten Sie ihn nicht maschinell aus.

    Statuscodes der Structify-API
    StatusBedeutung
    200Erfolg.
    400Ungültige Anfrage: Pflichtfeld fehlt, Wert unzulässig (zum Beispiel ein unbekannter Status), ungültige Kennung in einem Filter, der zu ändernde Datensatz existiert nicht, die Methode ist für diesen Pfad nicht vorgesehen (Projekte, Mängel, Webhooks) oder die Anfrage konnte nicht verarbeitet werden.
    401Schlüssel fehlt, ist ungültig oder deaktiviert.
    403Recht fehlt für diese Aktion; die Person, die den Schlüssel angelegt hat, gehört nicht mehr zur Geschäftsführung; oder ihre Zustimmung zu neuen Rechtstexten steht noch aus.
    404Pfad unbekannt oder Datensatz nicht gefunden – bei Einzelabrufen auch für ungültige Kennungen und für Kennungen anderer Organisationen.
    429Ratenbegrenzung erreicht.
    503Die Berechtigung konnte gerade nicht geprüft werden. Bitte später erneut versuchen.

    Bei Störungen im Betrieb, etwa 502 oder 504 nach einer Zeitüberschreitung, kann die Antwort ein anderes oder gar kein JSON enthalten. Werten Sie dann nur den Status aus und versuchen Sie es später erneut. Prüfen Sie vor einem erneuten POST /v1/tickets per GET, ob der Mangel nicht doch schon angelegt wurde.

    Webhooks

    Ein Webhook meldet Ihrem System ein Ereignis per HTTP-POST an eine von Ihnen festgelegte Adresse. Heute versendet Structify genau zwei Ereignisse:

    Webhook-Ereignisse
    EreignisWird ausgelöst, wenn
    ticket.erstelltein Mangel über POST /v1/tickets angelegt wird
    ticket.status_geaendertPUT /v1/tickets/{id} das Feld status enthält – auch wenn sich der Wert dabei nicht ändert

    Wichtig Nur Änderungen über die API selbst.

    Mängel, die in der Web-App oder in Structify auf iPhone & Android angelegt oder geändert werden, lösen heute keinen Webhook aus. Weitere in den Einstellungen auswählbare Ereignisse werden derzeit nicht versendet.

    Aufbau einer Nachricht

    data enthält den gespeicherten Datensatz des Mangels mit allen Feldern (hier gekürzt; dazu gehören auch Kontakt-E-Mail, zuständige Firma und Notizen), timestamp den Zeitpunkt des Versands.

    Kopfzeilen
    POST /structify-webhook HTTP/1.1
    Host: ihre-firma.example
    Content-Type: application/json
    X-Structify-Signature: sha256=<HEX>

    Körper
    {
      "event": "ticket.status_geaendert",
      "data": {
        "id": "<MANGEL_ID>",
        "organization_id": "<ORGANISATIONS_ID>",
        "project_id": "<PROJEKT_ID>",
        "defect_number": "M-ERP-001",
        "building_location": "2. OG, Raum 2.14",
        "description": "Brandschutzklappe ohne Revisionsöffnung",
        "status": "behoben",
        "severity": "erheblich",
        "discipline": "Lüftung",
        "remediation_deadline": "2026-11-15",
        "created_at": "2026-10-08T07:41:03.118+00:00"
      },
      "timestamp": "2026-10-09T13:05:12.402Z"
    }

    Zustellung

    • Structify sendet die Nachricht, während die auslösende API-Anfrage verarbeitet wird. Ein langsamer Empfänger verzögert deshalb deren Antwort.
    • Zeitlimit 5 Sekunden je Empfänger; höchstens 10 Webhooks je Ereignis. Sind für ein Ereignis mehr als 10 Webhooks registriert, ist nicht festgelegt, welche 10 beliefert werden.
    • Keine Wiederholung bei Fehlern. Zeitpunkt und HTTP-Status des letzten Versuchs zeigt GET /v1/webhooks (letzter_versuch, letzte_antwort; 0 bedeutet: keine Antwort).
    • Verwenden Sie für die Zieladresse HTTPS.

    Signatur prüfen

    Die Kopfzeile X-Structify-Signature enthält sha256= und den HMAC-SHA256 des unveränderten Anfragekörpers, gebildet mit dem Signaturschlüssel des Webhooks. Vergleichen Sie zeitkonstant:

    Signatur prüfen (Node.js)
    import crypto from "node:crypto";
    
    // rawBody: der unveränderte Anfragekörper, nicht neu serialisiert
    export function isValidSignature(rawBody, signatureHeader, signingSecret) {
      const expected = "sha256=" + crypto
        .createHmac("sha256", signingSecret)
        .update(rawBody)
        .digest("hex");
      const a = Buffer.from(expected);
      const b = Buffer.from(signatureHeader ?? "");
      return a.length === b.length && crypto.timingSafeEqual(a, b);
    }

    Wichtig Signaturschlüssel nur bei Registrierung über die API.

    Den Signaturschlüssel erhalten Sie einmalig in der Antwort auf POST /v1/webhooks (Feld signing_secret; derselbe Wert steht dort auch im gespeicherten Datensatz unter data.secret – protokollieren Sie diese Antwort deshalb nicht). Webhooks, die Sie in den Einstellungen der Web-App anlegen, zeigen ihren Signaturschlüssel heute nicht an – registrieren Sie Webhooks deshalb über die API, wenn Sie die Signatur prüfen möchten.

    Die Signatur enthält keinen Zeitstempel. Wenn Sie wiederholt eingespielte Nachrichten abweisen möchten, prüfen Sie zusätzlich das Feld timestamp.

    Anleitungen

    Erster Abruf in fünf Schritten

    1. Melden Sie sich als Mitglied der Geschäftsführung in der Web-App an und öffnen Sie Einstellungen → Integrationen → API & Drittanbieter.
    2. Legen Sie einen Schlüssel mit einer sprechenden Bezeichnung an (zum Beispiel „ERP-Anbindung“) und wählen Sie nur die Rechte, die Ihr System braucht.
    3. Kopieren Sie den Schlüssel sofort – er wird nur einmal angezeigt – und hinterlegen Sie ihn auf Ihrem Server, zum Beispiel als Umgebungsvariable STRUCTIFY_API_KEY.
    4. Rufen Sie GET /v1/projekte auf, wie im Abschnitt Beispielanfrage gezeigt.
    5. Prüfen Sie die Antwort: Status 200, Ihre Projekte in data und die verbleibenden Anfragen in X-RateLimit-Remaining.

    Mängel aus Ihrem System anlegen und nachführen

    Voraussetzung ist ein Schlüssel mit dem Recht Tickets schreiben. Legen Sie den Mangel an und merken Sie sich die zurückgegebene id:

    Mangel anlegen
    curl -X POST "https://api.structify.solutions/functions/v1/public-api/v1/tickets" \
      -H "X-Api-Key: <IHR_API_SCHLUESSEL>" \
      -H "Content-Type: application/json" \
      -d '{"project_id":"<PROJEKT_ID>","defect_number":"M-ERP-001","building_location":"2. OG, Raum 2.14","description":"Brandschutzklappe ohne Revisionsöffnung","severity":"erheblich","discipline":"Lüftung","remediation_deadline":"2026-11-15"}'

    Antwort 200 (gekürzt)
    {
      "data": {
        "id": "<MANGEL_ID>",
        "organization_id": "<ORGANISATIONS_ID>",
        "project_id": "<PROJEKT_ID>",
        "defect_number": "M-ERP-001",
        "building_location": "2. OG, Raum 2.14",
        "description": "Brandschutzklappe ohne Revisionsöffnung",
        "status": "offen",
        "severity": "erheblich",
        "discipline": "Lüftung",
        "remediation_deadline": "2026-11-15",
        "created_at": "2026-10-08T07:41:03.118+00:00"
      },
      "message": "Ticket erstellt"
    }

    Später setzen Sie den Status – das löst das Ereignis ticket.status_geaendert aus:

    Status ändern
    curl -X PUT "https://api.structify.solutions/functions/v1/public-api/v1/tickets/<MANGEL_ID>" \
      -H "X-Api-Key: <IHR_API_SCHLUESSEL>" \
      -H "Content-Type: application/json" \
      -d '{"status":"behoben"}'

    Offene Mängel eines Projekts rufen Sie gefiltert und seitenweise ab:

    Offene Mängel eines Projekts abrufen
    curl "https://api.structify.solutions/functions/v1/public-api/v1/tickets?projekt_id=<PROJEKT_ID>&status=offen&limit=50&offset=0" \
      -H "X-Api-Key: <IHR_API_SCHLUESSEL>"

    Antwort 200
    {
      "data": [
        {
          "id": "<MANGEL_ID>",
          "defect_number": "M-ERP-001",
          "building_location": "2. OG, Raum 2.14",
          "description": "Brandschutzklappe ohne Revisionsöffnung",
          "status": "offen",
          "severity": "erheblich",
          "discipline": "Lüftung",
          "remediation_deadline": "2026-11-15",
          "project_id": "<PROJEKT_ID>",
          "created_at": "2026-10-08T07:41:03.118+00:00",
          "projects": {
            "project_name": "Neubau Bürogebäude Musterstraße"
          }
        }
      ],
      "total": 1,
      "limit": 50,
      "offset": 0
    }

    Webhook einrichten und Signatur prüfen

    Registrieren Sie den Webhook über die API und speichern Sie signing_secret aus der Antwort sicher auf Ihrem Server:

    Webhook registrieren
    curl -X POST "https://api.structify.solutions/functions/v1/public-api/v1/webhooks" \
      -H "X-Api-Key: <IHR_API_SCHLUESSEL>" \
      -H "Content-Type: application/json" \
      -d '{"name":"ERP-Anbindung","url":"https://ihre-firma.example/structify-webhook","events":["ticket.erstellt","ticket.status_geaendert"]}'

    Antwort 200 (gekürzt)
    {
      "data": {
        "id": "<WEBHOOK_ID>",
        "name": "ERP-Anbindung",
        "url": "https://ihre-firma.example/structify-webhook",
        "events": [
          "ticket.erstellt",
          "ticket.status_geaendert"
        ],
        "ist_aktiv": true
      },
      "message": "Webhook registriert",
      "signing_secret": "<SIGNATURSCHLUESSEL>"
    }

    Prüfen Sie bei jeder eingehenden Nachricht die Signatur (siehe Abschnitt Webhooks) und antworten Sie innerhalb von 5 Sekunden mit einem 2xx-Status.

    Was die API heute nicht kann

    Damit Sie verlässlich planen können, nennen wir offen, was die Schnittstelle heute nicht bietet:

    • Einträge aus „Projekttickets“ und Gewährleistungsmängel aus „Gewährleistungsmangel“ abrufen oder schreiben.
    • Bautagebuch-Einträge abrufen oder schreiben, die Sie heute als Projektticket der Art „Bautagebuch-Eintrag“ anlegen. GET /v1/bautagebuch liefert nur Alteinträge des früheren Bautagebuch-Bereichs.
    • Dokumente aus Vorlagen im Projektbereich „Protokolle und Formulare“ (zum Beispiel Mängelanzeige, Behinderungsanzeige oder Protokolle) sowie Gesprächsprotokolle aus „Grundlagenermittlung“, „Planungsgespräch“ und „Baustellengespräch“ abrufen.
    • Mangelnummern automatisch vergeben.
    • Projekte anlegen oder ändern – Projekte sind nur lesbar.
    • Eine projektübergreifende Volltextsuche.
    • Dateien herunter- oder hochladen; Fotos, Pläne und Anhänge übertragen.
    • Angaben zu Plänen und zu Fotos aus der Fotogalerie abrufen – /v1/dokumente liefert nur die Dokumentdatenbank.
    • Protokolle, Einträge des früheren Bautagebuchs und Dateiangaben anlegen oder ändern.
    • Nutzer, Rollen und Mitglieder abrufen; Kontakte, Rechnungen, Honorarermittlung, Vergabe und Nachträge als eigene Bereiche abrufen. Honorar-, Budget- und Abrechnungsangaben sowie Ansprechpartner, die im Projekt selbst gespeichert sind, liefert der Einzelabruf eines Projekts dagegen mit.
    • Webhooks für Änderungen in der Web-App oder in Structify auf iPhone & Android; erneute Zustellung fehlgeschlagener Webhooks.
    • Anmeldung per OAuth, persönliche Zugriffstoken oder Schlüssel, die auf einzelne Projekte beschränkt sind.
    • Eine Testumgebung, eine maschinenlesbare Schnittstellenbeschreibung (OpenAPI) oder fertige Programmbibliotheken.

    Hinweis Ihnen fehlt etwas?

    Schildern Sie uns Ihren Anwendungsfall – das hilft uns bei der Planung der nächsten Schritte.

    Kontakt aufnehmen

    Änderungsprotokoll

    1. 08.10.2026 In der Web-App verwaltet nur noch die Geschäftsführung API-Schlüssel und Webhooks. Ein Schlüssel gilt nur, solange die Person, die ihn angelegt hat, aktives Mitglied der Geschäftsführung ist.
    2. 06.10.2026 Neue Basis-URL https://api.structify.solutions/functions/v1/public-api nach dem Umzug des Betriebs zu Hetzner in Deutschland. Die frühere Adresse ist nicht mehr erreichbar.
    Anbindung

    Fragen zur Anbindung?

    Wir helfen Ihnen, Structify mit Ihren Systemen zu verbinden – sachlich und mit dem Umfang, den die API heute bietet.