# 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

<!-- example:quickstart.sh -->
```sh
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.

<!-- example:quickstart.py -->
```python
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.

<!-- example:quickstart.ts -->
```typescript
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.

```json
{
  "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](coverage.md), [uwierzytelnianie](authentication.md) i [pełny opis odczytu](../../operations/parcel.md).
