Kodu, maa ja keskkond
Metsaregister
Metsateatised ja kavandatud raied kinnistu kaupa, koos eraldiste ja takseerandmetega.
Metsaregister (register.metsad.ee) hoiab metsaeraldiste inventeerimisandmeid ja kavandatud töid: kinnistu numbri, katastritunnuse, kinnistu nime või kvartali numbri järgi saab kätte eraldised, nende pindala, kasvukoha ja peapuuliigi koodid ning takseerandmed. Kavandatud raie ei ole otsingu tulemuse real, vaid eraldise enda kirjes, nii et raieplaani kohta saab vastuse alles sealt. Maakond ja vald üksi ei ole otsing, nendega saab tulemust ainult kitsendada: tühi vastus nende peale ei tähenda, et seal metsa ei ole.
Mida su agent peab oskama
GETPiisab lehe tõmbamisest. Kõik vajalikud päringud on tavalised HTTPS-päringud. Iga agent, kes oskab veebilehe alla laadida, saab selle juhendi läbi teha.
Juhend ise
Inglise keeles, sest seda loeb mudel.
Forest Register
Vetted module (use this first)
metsad.mjs ships in https://kodanikukratt.ee/kratt-agent.tar.gz (plain ESM, Node 22+) and is re-verified against the live source:
import { show } from "./kratt.mjs";
import { forestStands, standDetails } from "./metsad.mjs";
const p = await forestStands({ kinnistuNr: 12345 });
show({ kokku: p.totals, note: p.note });
show(p.rows.slice(0, 5));
const s = await standDetails(p.rows[0].id); // the row's `id`, NOT eraldiseNr
show({ maakond: s.maakond, vald: s.vald, korraldaja: s.korraldaja, raied: s.plannedWork });
forestStands({katastriNr, kinnistuNr, yksuseNimi, kvartaliNr})flattens the property tree and counts and sums in code:totals.standsandtotals.areaHaare computed over every stand the search returned, so they stay right when only some rows are printed.- County and municipality narrow a search; they are not a search.
maakondKood/valdKoodalone return an empty list, which is not the same as "there is no forest there" — the module throws with that sentence rather than letting the empty list be read as an answer. - A stand row carries no planned felling.
toodandelemendidcome back empty from the search and are filled only bystandDetails(id), whoseplannedWorkis the proposed raie withtooKoodandkogusTm. Answer "is a felling planned here" from there, never from a row. idis noteraldiseNrand notyksusId. The register answers HTTP 400{"message":"Tehniline viga"}for ayksusId— and for aneraldiseNr, and for any other number that is not a stand id (re-checked 2026-08-02; this guide said 403 until then). A bare "technical error" reads like the register being broken rather than the caller holding the wrong identifier, so the module rejects both by name first.
claim The register answers HTTP 400 `{"message":"Tehniline viga"}` for a `yksusId`
GET https://register.metsad.ee/portaal/api/rest/eraldis/detail/198528
expect-status 400
expect /Tehniline viga/
# 198528 is the yksusId of the property `forestStands({kinnistuNr: 12345})`
# returns; 1675494 is one of its stands. The control is the SAME route with a
# real stand id, because a register answering 400 to everything would confirm
# this claim on a day when standDetails was broken for every caller.
control GET https://register.metsad.ee/portaal/api/rest/eraldis/detail/1675494
codeFieldsare classification codes with no public code list — everyklassifikaator*path answers HTTP 302 toauth/oauth2/authorization/govsso, and following that redirect lands on the state authentication service's 200 HTML login page (tara.ria.ee) rather than an error, so aget()on one returns login markup that can pass for a result; the app's own bundles map each code to itself (re-checked 2026-08-02). Quote the code; do not translate it from memory.etapp: "AEGUNUD"means the inventory has expired, not that the forest is gone.
The endpoints below are the fallback if a module call throws.
Access
- Application:
https://register.metsad.ee/ - API base:
https://register.metsad.ee/portaal/api/rest/ - No authentication is required for the public calls below.
Search
Send GET eraldis/puu with one or more URL parameters:
katastriNr: cadastral identifier.kinnistuNr: property number.yksuseNimi: property name.kvartaliNr: forest quarter number.maakondKoodandvaldKood: optional location narrowing.
At least one of katastriNr, kinnistuNr, yksuseNimi, or kvartaliNr is required; county or municipality alone is not a search. Example:
GET https://register.metsad.ee/portaal/api/rest/eraldis/puu?kinnistuNr=12345
The response is a property tree: top-level units contain alamYksused, and cadastral sub-units contain eraldised. Each stand has an id, katastriNr, eraldiseNr, pindala, status, ownership label, and EPSG:3301 GeoJSON string.
Detail
Use the stand id, not its displayed stand number:
GET https://register.metsad.ee/portaal/api/rest/eraldis/detail/{id}
Return identifiers, property and cadastral data, inventory date, county/municipality, area, site and main-species codes, dimensions, age/composition elements, volume/increment, damage, special features, proposed work, ownership fields, and alaGeoJson as available.
Limits
- Code fields such as
kasvukohaKood,peapuuliik, andtooKoodare register classifications; do not guess labels when a code list has not been retrieved. - Dates are Unix epoch milliseconds in several fields.
alaGeoJsonis a JSON-encoded string in EPSG:3301, not an already parsed WGS84 geometry.
Verify
Require a non-empty eraldised list, then require the detail response id to match the requested stand and preserve katastriNr plus eraldiseNr.
Module API
forestStands({katastriNr, kinnistuNr, yksuseNimi, kvartaliNr, maakondKood, valdKood}) -> {source, page, filter, totals, rows, note} standDetails(id) -> {source, page, id, katastriNr, eraldiseNr, maakond, vald, korraldaja, inventKp, plannedWork, elements, damages, codeFields, record, note}