Wird geladen...
Dokumentation
BetaREST über HTTPS mit JSON, ein OpenAPI-3.1-Vertrag und eine Quellenangabe zu jedem Wert. Basis-URL: https://api.enlapa.de
Erste Schritte
POST /v1/profile liefert alle Felder eines Presets für einen Punkt, jedes mit Quellenangabe. Das Beispiel fragt den Kölner Dom ab und deckelt die Kosten des Aufrufs bei 0,02 €.
# Schlüssel einmal setzen (Konsole → API-Schlüssel):
export ENLAPA_API_KEY="${ENLAPA_API_KEY:-HIER_IHR_SCHLUESSEL}"
curl -sS https://api.enlapa.de/v1/profile \
-H "X-API-Key: $ENLAPA_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"subject":{"kind":"point","longitude":6.9583,"latitude":50.9413},"preset":"general","max_cost_micros":20000}'Ohne Code ausprobieren: derselbe Aufruf im Playground.
Der Katalog nennt jedes Feld mit den Ländern, die es abdeckt, seiner Grundlage und seiner Lizenz. Zum Datenkatalog
curl -sS "https://api.enlapa.de/v1/catalog/fields?preset=pv_freiflaeche"Erste Schritte
Jede Datenabfrage braucht den Header X-API-Key: enlapa_…. Schlüssel haben den Bereich data:read, gelten höchstens 365 Tage und lassen sich im Konto mit Übergangsfrist rotieren. Laufende Clients arbeiten beim Wechsel weiter.
Datenabfragen nehmen keine Browser-Anfragen an (kein CORS). Das ist Absicht: Ein Schlüssel in einer Webseite ist für jeden lesbar, der sie öffnet. Rufen Sie die API aus Ihrem Backend, einem Job oder einer Agenten-Laufzeit auf.
Das Konto selbst (Schlüssel, Nutzung, Guthaben) verwalten Sie mit einer kurzlebigen Sitzung, gesendet als Authorization: Bearer. Ein Schlüssel kann das Konto lesen, aber nicht verwalten.
Konzepte
Beispielhafter Ausschnitt einer Profil-Antwort
{
"envelope_version": "dapi-2",
"fields": {
"gemeinde_name": {
"value": "Köln",
"unit": null,
"status": "ok",
"source": {
"id": "bkg_verwaltungsgrenzen",
"name": "Verwaltungsgrenzen Kreise + Gemeinden (BKG VG25)",
"publisher": "GeoBasis-DE / BKG (VG25), CC BY 4.0",
"url": "https://gdz.bkg.bund.de/index.php/default/verwaltungsgebiete-1-25-000-stand-31-12-vg25.html"
},
"licence": {
"id": "CC-BY-4.0",
"url": "https://creativecommons.org/licenses/by/4.0/"
},
"attribution": "© GeoBasis-DE / BKG (VG25), CC BY 4.0",
"basis": "official_register",
"vintage": "2024",
"fetched_at": "2026-10-01T03:12:44Z",
"refresh_cycle": "annual",
"support": "point_sample",
"resolution_m": null,
"derivation": null,
"reason": null,
"retryable": null
},
"naturschutzgebiet_inside": {
"value": null,
"unit": null,
"status": "absent",
"source": {
"id": "bfn_naturschutzgebiete",
"name": "Naturschutzgebiete (BfN)",
"publisher": "Bundesamt für Naturschutz (BfN)",
"url": "https://geodienste.bfn.de/ogc/wfs/schutzgebiet"
},
"licence": {
"id": "GeoNutzV",
"url": "https://www.gesetze-im-internet.de/geonutzv/"
},
"attribution": "© BfN",
"basis": "official_register",
"vintage": null,
"fetched_at": "2026-09-12T02:40:03Z",
"refresh_cycle": "monthly",
"support": "point_sample",
"resolution_m": null,
"derivation": null,
"reason": null,
"retryable": null
}
},
"not_covered": [
{
"field": "naturdenkmal_inside",
"reason": "outside_coverage"
}
]
}
| ok | Ein Wert mit Quelle, Lizenz, Abrufzeitpunkt, Grundlage und räumlichem Bezug. |
| absent | Die Quelle deckt den Ort ab und hat dort nichts, z. B. kein Naturschutzgebiet am Punkt. Das ist ein Befund, kein Fehler. |
| not_covered | Keine nutzbare Quelle für diesen Ort oder dieses Kriterium (anderes Bundesland, nicht lizenzierbar, veraltet). Mit Grund, ohne Ersatzwert. |
| failed | Die Quelle gibt es, die Abfrage ist gerade fehlgeschlagen. retryable sagt, ob sich ein neuer Versuch lohnt. |
Fehlen Daten, sagt die Antwort das: Das Feld steht unter not_covered mit Grund (outside_coverage, not_licensable, stale, needs_area, …). Geschätzt wird nichts. Berechnet wird ein Aufruf nur, wenn er mindestens einen Wert liefert; not_covered, Fehler und Ablehnungen sind kostenlos.
Konzepte
official_registerAus einem amtlichen Register oder amtlichen Geodaten (z. B. ALKIS, BKG, Länderdienste).
Wie belastbar: Belastbar. Maßgeblich bleibt die Auskunft der zuständigen Stelle; Stand beachten.
plan_in_forceAus einem geltenden Bebauungs-, Flächennutzungs- oder Regionalplan.
Wie belastbar: Gibt den Plan wieder. Ersetzt weder den Plantext noch die Auskunft der Gemeinde.
plan_draftAus einem Planentwurf. Er ist nicht in Kraft und kann sich ändern.
Wie belastbar: Vorläufig. Zeigt, wohin die Planung geht.
operator_publication_nonbindingAus einer unverbindlichen Veröffentlichung eines Betreibers, etwa eines Netzbetreibers.
Wie belastbar: Zur Orientierung. Verbindlich ist nur die Antwort des Betreibers auf Ihre Anfrage.
osm_communityAus OpenStreetMap, gepflegt von Freiwilligen (ODbL).
Wie belastbar: Oft gut, aber nicht amtlich geprüft. Lücken und Stand schwanken je Region.
modelVon ENLAPA oder Dritten berechnet, z. B. Ertragsschätzungen, Lärmwerte oder Luftlinienabstände.
Wie belastbar: Eine Schätzung, keine Messung. Für Vorauswahl und Vergleich, nicht als Nachweis.
llm_extracted_draftVon einem Sprachmodell aus Dokumenten ausgelesen, z. B. aus Ratsbeschlüssen.
Wie belastbar: Ungeprüfter Entwurf, kann falsch oder unvollständig sein. Immer an der Quelle prüfen.
| basis | Bedeutung | Wie belastbar |
|---|---|---|
Amtlichofficial_register | Aus einem amtlichen Register oder amtlichen Geodaten (z. B. ALKIS, BKG, Länderdienste). | Belastbar. Maßgeblich bleibt die Auskunft der zuständigen Stelle; Stand beachten. |
Plan in Kraftplan_in_force | Aus einem geltenden Bebauungs-, Flächennutzungs- oder Regionalplan. | Gibt den Plan wieder. Ersetzt weder den Plantext noch die Auskunft der Gemeinde. |
Planentwurfplan_draft | Aus einem Planentwurf. Er ist nicht in Kraft und kann sich ändern. | Vorläufig. Zeigt, wohin die Planung geht. |
Betreiberangabeoperator_publication_nonbinding | Aus einer unverbindlichen Veröffentlichung eines Betreibers, etwa eines Netzbetreibers. | Zur Orientierung. Verbindlich ist nur die Antwort des Betreibers auf Ihre Anfrage. |
OpenStreetMaposm_community | Aus OpenStreetMap, gepflegt von Freiwilligen (ODbL). | Oft gut, aber nicht amtlich geprüft. Lücken und Stand schwanken je Region. |
Modellmodel | Von ENLAPA oder Dritten berechnet, z. B. Ertragsschätzungen, Lärmwerte oder Luftlinienabstände. | Eine Schätzung, keine Messung. Für Vorauswahl und Vergleich, nicht als Nachweis. |
KI-Auszug (Entwurf)llm_extracted_draft | Von einem Sprachmodell aus Dokumenten ausgelesen, z. B. aus Ratsbeschlüssen. | Ungeprüfter Entwurf, kann falsch oder unvollständig sein. Immer an der Quelle prüfen. |
Konzepte
Allgemein
general · 245 Felder
Umwelt
environment · 147 Felder
Wasser und Hochwasser
water_flood · 25 Felder
Planungsrecht
planning_law · 97 Felder
Infrastruktur
infrastructure · 187 Felder
Due Diligence
due_diligence · 617 Felder
Wohnen
residential · 581 Felder
Gewerbe und Logistik
commercial_logistics · 327 Felder
Rechenzentrum
data_center · 304 Felder
PV-Freifläche
pv_freiflaeche · 201 Felder
Agri-PV
agri_pv · 158 Felder
Batteriespeicher
bess · 149 Felder
Betrieb
Betrieb
| Code | HTTP | Wiederholen | Bedeutung und Abhilfe (englisch, aus der API) |
|---|---|---|---|
| ACCOUNT_CAP_ABOVE_CEILING | 403 | nein | The requested monthly spending cap exceeds the operator ceiling.Choose a cap at or below the operator ceiling, or contact support. |
| ACCOUNT_KEY_NOT_ROTATABLE | 409 | nein | The key is revoked, expired or has an invalid product scope.Create a new data:read key through the account session. |
| ACCOUNT_MISMATCH | 409 | nein | This request was made for another account than the one this session is signed in to (the account guard header names another account).Reload the console: another tab switched the account. Nothing was changed. |
| ACCOUNT_NOT_CLOSABLE | 403 | nein | This account cannot be closed from the console.Contact support. |
| ACCOUNT_NOT_FOUND | 404 | nein | No Data API account belongs to this sign-in.Sign up with POST /v1/signup/cognito, or use the access link sent to the account's contact address. |
| ACCOUNT_PAUSED | 403 | nein | The customer has paused data requests for this account.Resume requests through the account limits operation using an account session. |
| ACCOUNT_SESSION_INVALID | 401 | nein | The account session or access link is missing, expired, used or revoked.Request a new account access link and exchange it for a session. |
| ACCOUNT_SESSION_REQUIRED | 403 | nein | This operation requires an account session.Use the session from the e-mailed account access link; an API key cannot manage the account. |
| ACCOUNT_SUSPENDED | 403 | nein | The API account is suspended (for example after a refund or a payment dispute left its balance negative, or by an administrator). No operation answers until it is reactivated.Contact support; resending the request does not help. |
| API_KEY_INVALID | 401 | nein | The X-API-Key presented is unknown, expired or revoked.Check that the whole key was sent; a revoked or expired key has to be replaced by a new one. |
| API_KEY_MISSING | 401 | nein | No X-API-Key header was sent.Send the account's API key in the X-API-Key header. Keys belong on a server, never in a browser. |
| API_KEY_SCOPE_INVALID | 403 | nein | The key is valid but was not issued for the data API (it does not carry exactly the data:read scope), for example a DataHub or a personal MCP key.Send the account's data API key; a key issued for another product does not open this API. |
| BILLING_CUSTOMER_MISSING | 409 | nein | This account has no billing record yet (no top-up and no plan so far).Top up the balance or start a plan first; the billing portal opens after the first payment. |
| BILLING_PORTAL_UNAVAILABLE | 503 | ja | The billing portal is not available right now.Top-ups, invoices and the plan are in the console; try the portal again later. |
| BILLING_PROVIDER_UNAVAILABLE | 503 | ja | The payment provider did not answer. Nothing was changed.Try again in a moment. |
| BILLING_UNAVAILABLE | 503 | ja | The payment provider is temporarily unavailable, or the account's billing record needs support.Try again later; contact support if it persists. |
| BODY_TOO_LARGE | 413 | nein | The request body is larger than the service accepts (its Content-Length is above the limit). Nothing ran and nothing was charged.Send a smaller body: a simpler geometry or fewer items per request. |
| BUSINESS_DECLARATION_REQUIRED | 422 | nein | Signing up requires the declaration that you act as a business (§ 14 BGB).Confirm the business declaration and send the request again. |
| CATALOG_LOGIN_REQUIRED | 401 | nein | This part of the catalogue (a filter, a search or a dataset's detail) is served after login only.Send an API key (X-API-Key) from a server, or call it from the console with the account session (Authorization: Bearer). Without a credential the catalogue lists dataset names, categories and counts. |
| CLOSE_CONFIRMATION_MISMATCH | 422 | nein | The confirmation does not match the organisation name.Type the organisation name exactly as the console shows it. |
| COGNITO_EMAIL_UNVERIFIED | 403 | nein | The e-mail address of this sign-in is not verified.Verify the e-mail address in the sign-in dialog, then sign in again. |
| COGNITO_LOGIN_UNAVAILABLE | 503 | ja | Signing in with the console sign-in is not available right now.Use the e-mailed account access link, or try again after Retry-After. |
| COGNITO_TOKEN_INVALID | 401 | nein | The sign-in token is invalid, expired, already used or not issued for the Data API console.Sign in again and send the fresh ID token once. |
| CONCURRENCY_LIMIT | 429 | ja | Too many operations of this kind are already running, for this account or across the service. Nothing ran.Send the request again after Retry-After, and run fewer of these operations in parallel. |
| CONCURRENCY_UNAVAILABLE | 503 | ja | The service cannot count the operations running right now, so the request is refused rather than run without that limit. Nothing ran.Send the request again after Retry-After; nothing about the request itself is wrong. |
| DAILY_LIMIT | 429 | nein | The account reached one of its daily ceilings (spend, units, rows or search runs); a daily spending ceiling counts the calls still running too and resets at midnight, Europe/Berlin time. Nothing ran and nothing was charged.Wait until the ceiling resets (Retry-After gives the seconds when known), or ask support to raise it. |
| DEMO_BUSY | 429 | ja | The free live test is at its overall limit right now. Nothing ran.Wait for Retry-After, or create an account and call the API with your own key. |
| DEMO_DISABLED | 503 | ja | The free live test is switched off right now. Nothing ran.Try again later, or create an account and call the API with your own key. |
| DEMO_OPERATION_NOT_OFFERED | 404 | nein | The free live test offers only profile, distances and area-check, for one point in Germany.Create an account and call every operation with your own key (see the documentation). |
| DEMO_ORIGIN_REFUSED | 403 | nein | The free live test answers only the company website and clients that send no browser Origin.Use the playground on the company website, or create an account and call the API with your own key. |
| DEMO_OUTSIDE_GERMANY | 422 | nein | The free live test answers points in Germany only.Pick a point in Germany, or create an account for the full coverage. |
| DEMO_RATE_LIMITED | 429 | ja | The free live test allows a few calls per minute and per day from one network. Nothing ran.Wait for Retry-After, or create an account and call the API with your own key. |
| DEMO_UNAVAILABLE | 503 | ja | The free live test cannot answer right now. Nothing was charged.Try again in a moment, or create an account and call the API with your own key. |
| GEOCODE_BATCH_REFUSED | 422 | nein | The geocode request carried more than one address (a list, or several addresses separated by line breaks, ';' or '|'). Batch and bulk geocoding are not offered. Nothing ran and nothing was counted.Send one address per request, and keep each answer instead of geocoding the same address again. |
| GEOCODE_NOT_AN_ADDRESS | 422 | nein | The geocode query carries coordinates (decimal or degree notation). Geocode resolves addresses and place names; looking up the place at a coordinate is not offered. Nothing ran and nothing was counted.Send a postal address or a place name; a coordinate you already have needs no geocoding. |
| GEOCODE_THROTTLED | 429 | ja | The geocoder's shared request budget is used up for this moment (it serves one request per second for the whole service, interactive use first). Nothing ran and nothing was counted.Send the request again after Retry-After, one address per call; an answer you already have does not need a second call. |
| GEOCODE_UPSTREAM_UNAVAILABLE | 503 | ja | The geocoding service behind this operation timed out, was unreachable or answered with an error. Nothing was counted.Send the request again after Retry-After; nothing about the request itself is wrong. |
| GEOMETRY_TOO_LARGE | 422 | nein | The polygon's area is larger than the operation accepts (GET /v1/prices states the limit as area_tiers.max_ha). Nothing ran and nothing was charged.Split the area into smaller polygons and check each of them on its own. |
| IDEMPOTENCY_CONFLICT | 409 | nein | The Idempotency-Key was already used by this account for a request with a different operation or body. Nothing ran and nothing was charged.Send a new request with a fresh key; reuse a key only to repeat the identical request. |
| IDEMPOTENCY_IN_FLIGHT | 409 | ja | A request with the same Idempotency-Key is still being processed. Nothing ran a second time and nothing was charged twice.Send the identical request again (after Retry-After when given); once the first one has finished it returns that stored answer. |
| INSUFFICIENT_CREDIT | 402 | nein | The account's prepaid balance, after its free allowance, does not cover the price of this call. Nothing ran and nothing was charged.Top up the account, or ask for less; the unit prices are listed at GET /v1/prices. |
| INTERNAL_ERROR | 500 | nein | The operation broke on our side; nothing more is said about it (the detail of an internal fault is not a caller's to read). Nothing was charged.Report it with the request id if it persists; it is not known to be transient, so do not resend it in a loop. |
| LOCATOR_AMBIGUOUS | 422 | nein | The address resolves to several similarly ranked candidates in different municipalities. Nothing was charged.Choose a candidate point or send a more specific address with a new Idempotency-Key. |
| LOCATOR_NO_MATCH | 422 | nein | No usable point was found for the address. Nothing was evaluated or charged.Correct the address or send a known point with a new Idempotency-Key; never substitute an estimate. |
| MAX_COST_EXCEEDED | 402 | nein | The price of this call is above the max_cost_micros ceiling the request set. Nothing ran and nothing was charged.Raise max_cost_micros to at least the price (GET /v1/prices), or ask for less. |
| MAX_COST_REQUIRED | 422 | nein | A playground call needs a cost ceiling (body.max_cost_micros): a positive integer of micro-euros.Set max_cost_micros in the request body (null is no ceiling). |
| METHOD_NOT_ALLOWED | 405 | nein | The path exists but does not accept this HTTP method.Use the method the API description (GET /v1/openapi.json) lists for that path. |
| MONTHLY_LIMIT | 429 | nein | The account reached its monthly spending ceiling: the price of this call, with this calendar month's spend (Europe/Berlin) and the calls still running, would exceed it. Calls inside the free allowance still answer. Nothing ran and nothing was charged.Wait until the ceiling resets on the first of the month (Retry-After gives the seconds when that is less than a day away; detail names the date), or ask support to raise it. |
| NETWORK_RATE_LIMIT | 429 | ja | The request rate from this request's network address (IP) is above its ceiling, counted over five minutes for all keys and accounts behind that address together. Nothing ran and nothing was charged.Send the request again after Retry-After and spread calls instead of bursting them; if several integrations share one outgoing address, ask support to review the ceiling. |
| NOT_FOUND | 404 | nein | Nothing exists under this path or id for this account.Check the path against GET /v1/openapi.json, and take ids from an earlier answer. |
| NOT_LICENSABLE | 422 | nein | A source this answer needs is not cleared for redistribution through the API for this territory, or its clearance was withdrawn (a stored answer is then not replayed either). This is a licensing fact, not missing data and not a fault; nothing was charged.Do not resend it. Ask for other fields or another operation; GET /v1/sources states what each source may be used for. |
| NO_DATA | 404 | nein | The platform holds no data for this location. This is an ABSENCE of data, not a measurement of zero, and it is never charged.Report the gap; never substitute an estimate. |
| ONBOARDING_COMPLETED | 409 | nein | Agent setup is already complete for this account.Send {"again": true} to set up another agent with a new key. |
| OPERATION_NOT_IN_PLAYGROUND | 422 | nein | This operation cannot run in the console playground.Call it with an API key from your own code (see the documentation). |
| OPERATION_NOT_PRICED | 422 | nein | This operation has no published Data API price and cannot execute.Use a currently published operation; this capability is not available for paid publication yet. |
| OPERATION_TIMEOUT | 504 | nein | The operation ran past its time limit and was stopped, on the database as well.Ask for less (a smaller area, fewer rows or fields); the identical request is likely to run out of time again. |
| OPERATION_WITHDRAWN | 503 | nein | This operation is withdrawn for all accounts while the rest of the data API keeps answering. Nothing ran and nothing was charged.Use another operation for now; the catalog (GET /v1/catalog) lists the operation as withdrawn until it is back. Resending the same request will not succeed while it is withdrawn. |
| PAID_CREDIT_REQUIRED | 402 | nein | The call contains pass-through units (such as Bavarian parcels: an external fee is paid per unit), and the account's topped-up credit does not cover them; the welcome credit never does, and a billing-exempt account is never served them. Nothing ran and nothing was charged.Top up the account (any top-up counts), then send the request again; GET /v1/prices marks the pass_through units. A parcel search can leave Bavaria out (include_bavaria false). |
| PLAN_ALREADY_ACTIVE | 409 | nein | The account already has a monthly plan subscription.Switch it with POST /v1/account/plan/switch or cancel it with POST /v1/account/plan/cancel. |
| PLAN_INVALID | 422 | nein | Only the monthly plans build and growth can be chosen here.Choose build or growth; Enterprise is contracted separately. |
| PLAN_NOT_CANCELLING | 409 | nein | The subscription has no pending cancellation to undo.Nothing to do; GET /v1/account shows the plan and its next renewal. |
| PLAN_NOT_FOUND | 404 | nein | The account has no monthly plan subscription that is still billing.Start one with POST /v1/account/plan. A plan just paid for may take a minute to appear. |
| PLAN_UNCHANGED | 409 | nein | The subscription already renews as this plan.Choose the other plan, or resume a pending cancellation with POST /v1/account/plan/resume. |
| PLAYGROUND_DISABLED | 503 | ja | The console playground is switched off right now.Call the API with your own key, or try again later. |
| PLAYGROUND_RATE_LIMITED | 429 | ja | The console playground's per-account limit (per minute or per day) is reached. Nothing ran.Wait for Retry-After, or call the API with your own key. |
| RATE_LIMITER_UNAVAILABLE | 503 | ja | The rate limiter's backend is down, so the request is refused rather than run unmetered.Send the request again after Retry-After; nothing about the request itself is wrong. |
| RATE_LIMIT_EXCEEDED | 429 | ja | The per-minute request ceiling of this key or of the account is reached.Send the request again after Retry-After, and spread calls instead of bursting them. |
| REQUEST_REJECTED | 400 | nein | The request was refused for a reason no more specific code covers; detail says why.Correct the request as detail describes; resending it unchanged gives the same answer. |
| SEARCH_TOO_BROAD | 422 | nein | The parcel search is larger than an interactive call may run (the engine would queue it). Nothing was charged.Queue it as a durable run (POST /v1/parcels/search/runs, free; its pages are charged as usual), or narrow the search: a smaller area or more filters. |
| SERVICE_PAUSED | 503 | ja | The data API is paused for all accounts (maintenance or an incident). Nothing ran and nothing was charged.Send the request again after Retry-After; nothing about the request or the account is wrong. |
| SESSION_TRANSPORT_UNAVAILABLE | 422 | nein | The session cookie is not available here (or the request did not come from the console).Send session_transport 'bearer' and keep the session token in memory. |
| SIGNUP_ACCOUNT_EXISTS | 409 | nein | This sign-in or e-mail address already has a Data API account.Sign in with POST /v1/account/session/cognito, or use the e-mailed account access link. |
| SIGNUP_CAPTCHA_FAILED | 403 | nein | The signup captcha was not verified.Solve a fresh captcha and submit again. |
| SIGNUP_DISPOSABLE_DOMAIN | 422 | nein | Disposable email domains cannot receive free API accounts.Use a company email address. |
| SIGNUP_DOMAIN_LIMIT | 409 | nein | The email domain has reached its free-account limit.Contact support for another account. |
| SIGNUP_RATE_LIMITED | 429 | nein | The network or email domain has reached its signup request limit.Wait for Retry-After before requesting signup again. |
| SIGNUP_TERMS_MISMATCH | 409 | nein | The accepted terms do not match the current terms.Read the current terms and submit their version and SHA-256 digest. |
| SIGNUP_TOKEN_CONSUMED | 409 | nein | The verification token was already consumed. The key cannot be shown again.Use the key saved at verification or contact support for key recovery by rotation. |
| SIGNUP_TOKEN_EXPIRED | 410 | nein | The verification token has expired.Request a new signup link. |
| SIGNUP_TOKEN_INVALID | 400 | nein | The verification token is invalid or its attempt limit was reached.Request a new signup link. |
| SIGNUP_UNAVAILABLE | 503 | ja | Email verification is temporarily unavailable.Try again after Retry-After. |
| SUBSCRIPTION_NOT_ACTIVE | 409 | nein | The plan cannot be switched while its first payment is pending or an invoice is unpaid.Wait until the payment is confirmed, or pay the open invoice (Stripe sent it by e-mail); cancelling stays possible. |
| TENANT_INACTIVE | 403 | nein | The account behind this key is deactivated.Contact support; no operation answers until the account is active again. |
| TOPUP_ABOVE_MAXIMUM | 422 | nein | The top-up amount exceeds the maximum per payment.Choose a smaller top-up amount. |
| TOPUP_AMOUNT_INVALID | 422 | nein | The top-up amount must be a positive whole number of euros, within the catalog bounds.Choose an amount within the limits in GET /v1/prices. |
| TOPUP_BELOW_MINIMUM | 422 | nein | The top-up amount is below the catalog minimum.Choose at least the minimum in GET /v1/prices. |
| TOPUP_NOT_CONFIGURED | 503 | ja | Account top-ups are temporarily unavailable.Contact support or try again later. |
| TOPUP_UNAVAILABLE | 503 | ja | The payment provider is temporarily unavailable.Try again later. |
| VALIDATION_ERROR | 422 | nein | The request does not match the operation's schema (a missing or malformed header, a wrong type, an unknown member). detail names each position, never the value sent.Correct the named positions; the schema of every operation is in GET /v1/openapi.json. |
| VAT_ID_UNUSABLE | 422 | nein | This VAT ID cannot be put on invoices (its country prefix or format is not supported). Nothing was changed.Check the VAT ID; the previous one stays on your invoices. |
Betrieb
Anfragen sind je Schlüssel, Konto und Netzwerkadresse begrenzt. Einige Operationen haben zusätzlich Tagesgrenzen (Einheiten, gelieferte Zeilen, Flurstückssuchen). Jede Antwort meldet das knappste Fenster in X-RateLimit-Limit, X-RateLimit-Remaining und X-RateLimit-Reset. Über der Grenze antwortet die API mit 429 und Retry-After; solche Aufrufe kosten nichts.
Ein neuer Schlüssel erlaubt derzeit 20 Anfragen pro Minute. Sie brauchen mehr? Schreiben Sie uns.
Die Adresssuche nimmt eine Adresse je Aufruf und ist nicht für Massen- oder Rasterabfragen gedacht. Request-Bodies sind größenbegrenzt; senden Sie Content-Length mit.
Agenten
Endpunkt (Streamable HTTP): https://api.enlapa.de/v1/mcp, Header X-API-Key.
# Schlüssel einmal setzen (Konsole → API-Schlüssel):
export ENLAPA_API_KEY="${ENLAPA_API_KEY:-HIER_IHR_SCHLUESSEL}"
claude mcp add --transport http enlapa-data https://api.enlapa.de/v1/mcp \
--header "X-API-Key: $ENLAPA_API_KEY"Nutzen Sie den MCP nur in Clients, die den Schlüssel auf Ihrem Rechner oder Server halten. Ein Werkzeugaufruf kostet so viel wie der REST-Aufruf dahinter. Übergeben Sie einen idempotency_key, dann wird ein wiederholter Aufruf nicht doppelt berechnet.
Referenz
/v1/catalogWhat the data API answers: operations, layers, field and source counts (keyless; detail after login)/v1/catalog/fieldsThe field catalog of POST /v1/profile, filterable by category, territory and preset (after login)/v1/catalog/datasetsSearch datasets in the shared category tree (keyless browsing; search and detail after login)/v1/catalog/layers/{layer_id}One dataset: its fields, distance layers, sources and Länder (after login)/v1/coverageWhat is answerable in which Land, per category (keyless) and per layer and distance layer (after login)/v1/sourcesEvery source behind the catalog: publisher, licence, attribution, vintage, last pull (after login)/v1/pricesThe current price list (net EUR, integer micros) (keyless)/v1/profileProfile a location: many measured values with their provenance, in one callkostenpflichtig/v1/profile/batchProfile 1–25 subjects synchronously with one field selectionkostenpflichtig/v1/area-checkFlächencheck of a point, a Flurstück or a polygonkostenpflichtig/v1/parcels/lookupLook up the Flurstück at a coordinate or under a Flurstückskennzeichenkostenpflichtig/v1/parcels/searchRun an interactive parcel search; page 1 comes with the runkostenpflichtig/v1/parcels/search/{run_id}/pages/{page_no}One page of a search run (charged once per page with at least one row; re-fetches are free)kostenpflichtig/v1/parcels/search/runsQueue a parcel search as a durable run (free; pages are charged when fetched)kostenpflichtig/v1/parcels/search/runs/{run_id}The status of a queued search run (free; optionally waits for it to finish)/v1/parcels/search/runs/{run_id}/cancelCancel a queued or running search run (free; a finished run is left unchanged)/v1/parcels/search/runs/{run_id}/artifactA succeeded run's persisted rows as one CSV (not priced yet: refused, free)/v1/parcels/search/fieldsDiscover accepted parcel-search criteria (keyless, free)/v1/geocodeGeocode one German addresskostenpflichtig/v1/distancesStraight-line distance to the nearest feature per layerkostenpflichtig/v1/distances/matrixStraight-line distances between caller-supplied origins and destinationskostenpflichtig/v1/operations/{request_id}Replay a retained operation after checking its rights (free)/v1/field-requestsRequest missing data and receive a synchronous disposition (free)/v1/field-requests/{id}Read your stored data request and disposition (free)/v1/signupSignup/v1/signup/verifyVerify Signup/v1/signup/cognitoCognito Signup/v1/account/access-linkRequest Account Access/v1/account/sessionGet Session Info/v1/account/sessionExchange Account Access/v1/account/sessionLogout Account/v1/account/session/cognitoExchange Cognito Sign In/v1/accountGet Account/v1/account/usageGet Account Usage/v1/account/transactionsGet Account Transactions/v1/account/keysGet Account Keys/v1/account/keysCreate Account Key/v1/account/keys/{key_id}/rotateRotate Account Key/v1/account/keys/{key_id}Revoke Account Key/v1/account/limitsPut Account Limits/v1/account/topupTopup Account/v1/account/planStart Account Plan/v1/account/plan/switchSwitch Account Plan/v1/account/plan/cancelCancel Account Plan/v1/account/plan/resumeResume Account Plan/v1/account/onboardingGet Onboarding/v1/account/onboardingStart Onboarding/v1/account/onboarding/skipSkip Onboarding/v1/account/playground/callsPlayground Call/v1/account/usage/summaryGet Usage Summary/v1/account/invoicesGet Invoices/v1/account/invoices/{invoice_id}/downloadDownload Invoice/v1/account/billing-portalOpen Billing Portal/v1/account/organizationPut Organization/v1/account/closeClose Account/v1/jobsQueue up to 500 profile or area-check subjects/v1/jobs/{job_id}Get Job/v1/jobs/{job_id}/artifacts/{format}Stream the completed job's CSV or GeoJSON, with provenance and attribution/v1/features/queryTyped rows or aggregates of reviewed shared datasets (protected areas, water/flood, soils, heritage, planning, Gemeinden)kostenpflichtig