{"openapi":"3.0.3","info":{"title":"abapp GIS Daten-API","version":"1.0.0","description":"Projekt-gebundener Zugriff auf Geo-Objekte, Objekttypen, Felder und Anhänge. Authentifizierung über einen API-Schlüssel (Bearer-Token), der an genau ein Projekt gebunden ist. Schlüssel mit Scope \"read\" lesen nur; Scope \"write\" erlaubt zusätzlich Anlegen/Ändern/Löschen.","contact":{"name":"abapp.one","url":"https://abapp.one"}},"servers":[{"url":"https://gis.abapp.one/api/public/v1"}],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Authorization: Bearer agk_…"},"apiKeyHeader":{"type":"apiKey","in":"header","name":"X-API-Key","description":"X-API-Key: agk_…"}},"schemas":{"GeoObject":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"geom_type":{"type":"string","enum":["point","path","polygon"]},"geometry":{"type":"object","nullable":true,"description":"GeoJSON-Geometrie (WGS84 / EPSG:4326) oder null (unplatziert)"},"elevation":{"type":"number","nullable":true},"object_type_id":{"type":"string","format":"uuid","nullable":true},"parent_geo_object_id":{"type":"string","format":"uuid","nullable":true},"display_name":{"type":"string","nullable":true},"properties":{"type":"object","additionalProperties":true},"version":{"type":"integer"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}}},"GeoObjectInput":{"type":"object","required":["geom_type"],"properties":{"geom_type":{"type":"string","enum":["point","path","polygon"]},"geometry":{"type":"object","nullable":true,"description":"GeoJSON-Geometrie (EPSG:4326) oder null"},"elevation":{"type":"number","nullable":true},"object_type_id":{"type":"string","format":"uuid","nullable":true},"parent_geo_object_id":{"type":"string","format":"uuid","nullable":true},"display_name":{"type":"string","nullable":true},"properties":{"type":"object","additionalProperties":true}}},"Error":{"type":"object","properties":{"error":{"type":"string"}}}}},"paths":{"/meta":{"get":{"summary":"Projekt-Metadaten + Schema (Typen & Felder)","responses":{"200":{"description":"OK"},"401":{"description":"Kein/ungültiger API-Schlüssel"}}}},"/object-types":{"get":{"summary":"Objekttypen des Projekts","responses":{"200":{"description":"OK"}}}},"/field-definitions":{"get":{"summary":"Felddefinitionen des Projekts","responses":{"200":{"description":"OK"}}}},"/objects":{"get":{"summary":"Objekte auflisten (gefiltert, paginiert)","parameters":[{"name":"type","in":"query","schema":{"type":"string"},"description":"Objekttyp-Name (ILIKE), inkl. Kindtypen"},{"name":"object_type_id","in":"query","schema":{"type":"string","format":"uuid"}},{"name":"exact","in":"query","schema":{"type":"boolean"},"description":"true = Kindtypen NICHT einschließen"},{"name":"geom_type","in":"query","schema":{"type":"string","enum":["point","path","polygon"]}},{"name":"bbox","in":"query","schema":{"type":"string"},"description":"minLng,minLat,maxLng,maxLat"},{"name":"placed","in":"query","schema":{"type":"string","enum":["true","false"]},"description":"true = nur platzierte, false = nur unplatzierte"},{"name":"updated_since","in":"query","schema":{"type":"string","format":"date-time"},"description":"nur seitdem geänderte (Delta-Sync)"},{"name":"q","in":"query","schema":{"type":"string"},"description":"Volltextsuche in Name/Properties"},{"name":"format","in":"query","schema":{"type":"string","enum":["json","geojson"]}},{"name":"limit","in":"query","schema":{"type":"integer","default":100,"maximum":1000}},{"name":"offset","in":"query","schema":{"type":"integer","default":0}}],"responses":{"200":{"description":"Liste","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/GeoObject"}},"total":{"type":"integer"},"limit":{"type":"integer"},"offset":{"type":"integer"}}}}}}}},"post":{"summary":"Objekt anlegen (Scope: write)","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GeoObjectInput"}}}},"responses":{"201":{"description":"Angelegt"},"400":{"description":"Validierungsfehler"},"403":{"description":"Nur Lesezugriff"}}}},"/objects.geojson":{"get":{"summary":"Platzierte Objekte als GeoJSON-FeatureCollection","responses":{"200":{"description":"OK"}}}},"/objects/{id}":{"get":{"summary":"Einzelnes Objekt","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK"},"404":{"description":"Nicht gefunden"}}},"patch":{"summary":"Objekt ändern — properties werden zusammengeführt (Scope: write)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GeoObjectInput"}}}},"responses":{"200":{"description":"Geändert"},"403":{"description":"Nur Lesezugriff"},"404":{"description":"Nicht gefunden"}}},"delete":{"summary":"Objekt löschen (Soft-Delete, Scope: write)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Gelöscht"},"403":{"description":"Nur Lesezugriff"},"404":{"description":"Nicht gefunden"}}}},"/objects/{id}/attachments":{"get":{"summary":"Anhänge eines Objekts (Metadaten + Download-URLs)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK"}}}},"/attachments/{id}":{"get":{"summary":"Anhang-Datei herunterladen","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Datei"},"404":{"description":"Nicht gefunden"}}}},"/data-sources/{name}/value":{"post":{"summary":"Wert in eine benannte Datenquelle einspeisen (Scope: write)","description":"Setzt den aktuellen Wert einer externen Datenquelle (z. B. Marktpreis, Lieferzeit, Sensorwert). Die Quelle muss im Projekt existieren. Danach via [Quelle:Name] im Autofill und in Feld-Warnungen nutzbar.","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string"},"description":"Name der Datenquelle (Groß/Klein egal)"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"value":{"description":"Wert (Zahl oder Text). Dezimalkomma wird erkannt."},"valueNum":{"type":"number","description":"Optional: expliziter Zahlenwert"}}}}}},"responses":{"200":{"description":"OK"},"404":{"description":"Datenquelle nicht gefunden"}}}}}}