Pierwsze wywołanie w 3 minuty
Klucz konta i identyfikator działki wystarczą do odczytu jednej warstwy. Adres API to https://mcp.agentdzialek.pl, a MCP działa pod /mcp. Poniższy odczyt kosztuje 1 kredyt; wynik i rozliczenie przychodzą w tej samej odpowiedzi.
1. Przygotuj klucz
W konsoli https://app.agentdzialek.pl otwórz Konto i użyj wydanego klucza API. Ustaw go w zmiennej środowiskowej LANDFEED_API_KEY w swoim menedżerze sekretów lub terminalu. Nie zapisuj klucza w pliku projektu ani w adresie URL. Jeśli konto nie ma jeszcze klucza lub kredytów, najpierw uzupełnij je w konsoli.
2. Odczytaj dane
Przykłady zwracają warstwę powodziową. Identyfikator i daty pochodzą z zapisanej próbki kontraktu; nie gwarantują danych dla tej działki w usłudze. Zastąp identyfikator własnym. Wybierz jeden z trzech sposobów.
curl
curl --silent --show-error --get 'https://mcp.agentdzialek.pl/v1/parcel' \
-H "X-Api-Key: ${LANDFEED_API_KEY}" \
--data-urlencode 'id=146501_1.0101.12/3' \
--data-urlencode 'layers=flood'
Python 3.10 lub nowszy
Zapisz kod jako quickstart.py i uruchom python3 quickstart.py. Korzysta wyłącznie z biblioteki standardowej.
import json
import os
import urllib.parse
import urllib.request
query = urllib.parse.urlencode({"id": "146501_1.0101.12/3", "layers": "flood"})
request = urllib.request.Request(
"https://mcp.agentdzialek.pl/v1/parcel?" + query,
headers={"X-Api-Key": os.environ["LANDFEED_API_KEY"]},
)
with urllib.request.urlopen(request, timeout=30) as response:
body = json.load(response)
# A 200 can still be ambiguous or uncovered. Never assume it means usable data.
if body["status"] == "ambiguous":
print(json.dumps({"candidates": body["candidates"]}, ensure_ascii=False))
elif body["status"] != "ok":
print(json.dumps({"status": body["status"], "error": body["error"]}, ensure_ascii=False))
else:
print(json.dumps({"layers": body["result"]["layers"], "billing": body["billing"]}, ensure_ascii=False))
TypeScript, Node.js 22.18 lub nowszy
Zapisz kod jako quickstart.ts i uruchom node quickstart.ts. W tym przykładzie Node wykonuje TypeScript bez dodatkowych pakietów.
const key = process.env.LANDFEED_API_KEY;
if (!key) throw new Error("Set LANDFEED_API_KEY");
const url = new URL("https://mcp.agentdzialek.pl/v1/parcel");
url.search = new URLSearchParams({ id: "146501_1.0101.12/3", layers: "flood" }).toString();
const response = await fetch(url, {
headers: { "X-Api-Key": key },
signal: AbortSignal.timeout(30_000),
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
const body = await response.json();
// Keep ambiguity, unavailable data and successful answers distinct.
if (body.status === "ambiguous") {
console.log(JSON.stringify({ candidates: body.candidates }));
} else if (body.status !== "ok") {
console.log(JSON.stringify({ status: body.status, error: body.error }));
} else {
console.log(JSON.stringify({ layers: body.result.layers, billing: body.billing }));
}
export {};
3. Sprawdź znaczenie odpowiedzi
Najpierw odczytaj status. Przy ambiguous pokaż candidates i poproś o wskazanie działki; HTTP 200 nie uprawnia do samodzielnego wyboru. Przy ok sprawdź result.layers.flood.coverage, note, source, as_of i zakres scope, jeśli jest obecny. Nie zamieniaj not_covered ani not_computed na informację o braku zagrożenia.
{
"status": "ok",
"query": {
"kind": "id",
"input": {
"id": "146501_1.0101.12/3"
},
"resolved": null
},
"result": {
"id": "146501_1.0101.12/3",
"admin": {
"voivodeship": "14",
"gmina_teryt": "1465011",
"gmina_name": "Warszawa",
"obreb_id": "146501_1.0101",
"number": "12/3"
},
"area": {
"official_m2": null,
"geometry_m2": 500,
"source": "computed",
"provenance": {
"id": "egib_parcels",
"title": "egib_parcels",
"attribution": "Źródło: Główny Urząd Geodezji i Kartografii (GUGiK), Ewidencja Gruntów i Budynków (EGiB)",
"as_of": "2026-10-01"
},
"note": "Powierzchnię obliczono z geometrii działki; powierzchnia urzędowa EGiB jest niedostępna."
},
"layers": {
"flood": {
"layer": "flood",
"coverage": "covered_no_data",
"value": {
"q10": false,
"q100": false,
"q500": false
},
"note": "Według map zagrożenia powodziowego działka leży poza wskazanymi na nich obszarami zagrożenia w sprawdzonym zakresie. Nie wyklucza to powodzi.",
"source": {
"id": "mzp_flood",
"title": "mzp_flood",
"attribution": "Źródło: Państwowe Gospodarstwo Wodne Wody Polskie, mapy zagrożenia powodziowego (ISOK), licencja CC BY 4.0",
"as_of": "2026-10-01"
},
"as_of": "2026-10-01",
"layer_version": "flood-national-20261016",
"licence": {
"position": "cc_by_4_0",
"attribution": "Źródło: Państwowe Gospodarstwo Wodne Wody Polskie, mapy zagrożenia powodziowego (ISOK), licencja CC BY 4.0",
"terms_url": "https://creativecommons.org/licenses/by/4.0/",
"review_ref": "seed/attribution_review_2026-10-13.sql#mzp_flood"
},
"scope": "parcel_polygon",
"method": "official"
}
},
"record_hash": null,
"display_geometry": {
"type": "MultiPolygon",
"coordinates": [
[
[
[
21.0,
52.0
],
[
21.001,
52.0
],
[
21.001,
52.001
],
[
21.0,
52.001
],
[
21.0,
52.0
]
]
]
]
},
"display_simplified": true,
"adjacent_parcel_ids": [
"146501_1.0101.12/4"
],
"adjacent_parcel_ids_truncated": false
},
"candidates": [],
"sources": [],
"billing": {
"cost": 1,
"charged": 1,
"refunded": 0,
"rule": "charged",
"credits": 1
},
"error": null,
"meta": {
"request_id": "fixture",
"api_version": "v1",
"contract_version": "2.0.0",
"operation": "parcel",
"generated_at": "2026-10-16T12:00:00Z",
"calls": 1
},
"auth": {
"kind": "api_key"
},
"plan": "free"
}
Ta próbka pokazuje format v2. Część działających odczytów zachowuje zgodny format v1 bez meta.contract_version; nie dopisuj brakujących pól. billing oraz nagłówki X-Credits-Charged i X-Credits-Refunded podają rozliczenie. Błędy HTTP w Pythonie i TypeScript kończą przykład; sprawdź ich treść przed ponowieniem.
Dalej: zakres danych, uwierzytelnianie i pełny opis odczytu.