Liigu sisu juurde

Kohus, õigused ja kaebused

Teabenõue ja kirjad ametiasutusele

Kuidas koostada juriidiliselt korrektne teabenõue, selgitustaotlus, märgukiri või vaie.

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.

Milline agent selle läbi teeb

Vastused, mis on siit tulnud

Juhend ise

Inglise keeles, sest seda loeb mudel.

Information requests and letters to authorities

The channel for public data that no API or register will give you: you ask a person at the authority, and the law puts them on a clock. Use it only after the open sources have failed — AvTS § 22 lets an authority answer a request by pointing at already-published data, so a letter asking for something you could have fetched wastes the citizen's time and an official's.

Give the letter as a block the reader can copy whole, never woven into your prose. The block renders a card the user can edit and send from their own mail client.

Pick the channel first — the deadlines differ

The citizen wantsChannelkindDeadline
Existing documents or data the authority already holdsteabenõueinformation_request5 working days
An explanation, or an answer that needs analysis, synthesis or extra data gatheringselgitustaotlusclarification_request15 calendar days
To propose something, or to pass on information about public lifemärgukirimemorandum15 calendar days
To contest a decision or a refusalvaiechallengedepends on the governing act

The line between the first two is drawn by law, not by taste: AvTS § 23 (2) 5) says a request that can only be answered by systematising and analysing data into new information counts as a selgitustaotlus, and MSVS § 2 (2) defines it the same way from the other side. Ask for documents that exist → teabenõue, and the answer is due in 5 working days instead of 15 calendar days.

The five-day promise is only safe for a document that already exists. That line is not just about which channel to pick — it keeps applying after the letter is sent. If answering the request as filed would take systematising and analysing data into new information, AvTS § 23 (2) 5) reclassifies it as a selgitustaotlus by operation of law, and the deadline becomes 15 calendar days without anyone having to decide anything or tell the sender.

So when the request is for something that exists — a named document, a register row, correspondence on a case — say five working days plainly. When it asks the body to compile, compare or explain, say the answer is due in 15 calendar days and say why, rather than promising five and leaving the citizen to think the authority is late on day six. Where it could honestly go either way, give the five-day deadline and name the condition that would move it.

Never state a date from your own arithmetic — count working days against the acts named below, and say which rule you counted under.

What a teabenõue must contain (AvTS § 14 (1))

  1. the requester's first and last name;
  2. the name of the institution or legal person, if the request is made on its behalf;
  3. contact details (postal or email address, fax, phone) the answer can be sent to;
  4. the content of the requested information, or the type, name and content of the document, or identifiers the requester knows;
  5. the requested manner of fulfilment (for us: electronically, to the sender's email).

Point 4 is the one that decides whether the request works. "Info about the procurement" invites a refusal under § 23 (1) 3); name the document type, the time range and the case if you know it.

If the request covers personal data about the requester or third parties, the authority verifies identity, and a request about third parties must state the legal basis and purpose (§ 14 (2)) — say so in the letter, or the request stalls.

Looking a body up — asutused.mjs

asutused.mjs ships in https://kodanikukratt.ee/kratt-agent.tar.gz (plain ESM, Node 22+) and holds the same verified table the letter card fills its recipient from. Use it instead of searching the web for an address, a website or a document register.

const a = authority("Saku vald");   // name, alias, former name, or an 8-digit registry code
// -> { name, kind, parent, email, phone, website,
//      register: { url, platform, searchable, guide },
//      where:    { county, municipality, municipalityCode, address },
//      openData: { url, datasets } | null,
//      page }
  • null means NOT in the table — say the address could not be found. Never compose one; a wrong address looks exactly like a right one to the reader.
  • A municipality's own name resolves to its government, so findAddress()municipality: "Saku vald"authority("Saku vald") joins an address to the body that answers for it. Former names work too ("Maanteeamet" → Transpordiamet, "Toila vald" → Jõhvi).
  • where.municipalityCode is the EHAK code that statistics, election results, planning and official notices are keyed by.
  • parent is the ministry whose valitsemisala it sits in — the body a citizen escalates to, and the register to try when the body's own has nothing (below). It is empty for ~19 state institutions, and empty means unknown.

register.searchable decides what you may do with the register, and register.guide names the recipe holding the contract — six platforms, six different request shapes, so never pick one yourself:

  • true — 156 of the 196 registers: adr, pdr, amphora, webdesktop, dhs-tallinn, dhs-tartu. Query it, following the recipe register.guide names. On adr.novian.ee only /kiirotsing works — its /otsing answers 500.
claim On `adr.novian.ee` only `/kiirotsing` works — its `/otsing` answers 500.
POST https://adr.novian.ee/saku_vald/otsing
body title=leping&pageNumber=1
expect-status 500
expect /Süsteemi viga!/
# This one is read immediately before every teabenõue, so a stale half of it
# costs a citizen five working days: if `/otsing` came back and the guide still
# said 500, we would draft a letter for documents the fielded search could have
# found. The 500 page says "Süsteemi viga!" — that, not a blank error, is the
# shape being pinned.
# The control is the quick search on the SAME instance, which must answer. A
# host that had gone down would refuse both, "confirming" that only the fielded
# search is broken while the whole register was unreachable.
control POST https://adr.novian.ee/saku_vald/kiirotsing
body input=leping&pageNumber=1
  • false — 40 registers: mostly own (whatever that body built for itself), plus three instances behind a login or a bot check. Hand the user the link, and say that WE have no verified way in — never that the register cannot be searched. The first is what we know; the second is a claim about the world that nobody checked, and the reader has no way to tell them apart.
  • register: null — 4 bodies, where we could not find one. That is OUR gap: AvTS obliges every body to publish a register, and several we had marked missing turned out to be on a different host under an unguessable slug. Do not tell the user the body has no register.

Before drafting a teabenõue for documents a register did not give you, try the ministry above the body. parentRegister(name) returns {name, register, call} when the parent's own register can be searched and null when it cannot — a ministry registers the same correspondence about a body it governs, and that holds whether the body's own register is unsearchable (9 of the 40) or searchable and simply thin (42 of the 156). Asked what documents existed about Eesti Loodusmuuseumi direktori konkurss, a run reported the register unsearchable and drafted a letter for five documents that were public in Kliimaministeerium's register the whole time. A teabenõue for already-published documents spends five working days of the citizen's time on nothing.

searchAuthorities({name, kind, county, municipality, searchableRegister}) filters the table — e.g. every municipality in one county, or every body whose register you can actually query. State counts from total, never by tallying the rows you printed; rows is capped and truncated says whether it was.

Never invent the requester's identity or the address

  • Name and contact go in as placeholders[Sinu ees- ja perekonnanimi], [Sinu e-posti aadress] — unless the user gave them to you in this conversation. The card highlights what is left to fill.
  • Never assemble a recipient address — the card looks it up. Name the authority in recipient_hint (e.g. Sotsiaalkindlustusamet) and stop there. The card resolves it against a table of officially registered addresses, fills the field, and the tool result tells you which address it used — or says the authority is not in the table, in which case the field is empty and the user has to find the address on the authority's own contact page.
  • The only address you may ever write is the one the tool result gave you. Not one you complete from a domain, not one you searched for, not one hedged with "check it first" — a citizen reading quickly will paste it. The pattern is not guessable: the register has vminfo@vm.ee for Välisministeerium and lvpost@tallinnlv.ee for Tallinna Linnavalitsus, and an attempt at this one produced four different @mfa.ee addresses, all wrong. If the tool result gave you no address, say the user needs to look it up, and do not go searching for it — the search results will not contain it either.
  • Keep addresses out of the subject and note fields regardless: the card has its own field for the recipient, and it strips addresses out of those two.
  • Link to the authority's contact page only if that exact URL was in data you fetched — otherwise name the authority in words.
  • If the letter reaches the wrong authority anyway, AvTS § 21 obliges them to forward it to the right holder within 5 working days and tell the sender — say this in your answer so a wrong address reads as a delay, not a dead end.

Letter template (Estonian, always — the authority answers in Estonian)

Teabenõue

Lugupeetud [asutuse nimi]

Palun väljastada mulle avaliku teabe seaduse alusel järgmine teave:
– [dokumendi liik, nimetus ja sisu või teabe täpne sisu, ajavahemik]

Palun edastada teave elektrooniliselt sellele e-posti aadressile.

Lugupidamisega
[Sinu ees- ja perekonnanimi]
[Sinu e-posti aadress]

Write the letter in Estonian even when the question was asked in English, then explain in your answer, in the user's language, what it says and what to fill in.

What to tell the user in your answer

Do not tell the citizen the authority "has no right to refuse" — § 23 lists grounds on which it must or may refuse, and an access restriction may well apply. Say what the request obliges them to do (answer, or refuse in writing with a reason) and what the remedy is if they refuse. Claim nothing about a document's access status that you have not read.

  • Which authority to send it to, and why that one holds the data.
  • What to fill in before sending, and that Kratt does not send it.
  • The deadline counted under a named rule, never a date of your own.
  • Only when relevant: copies on paper cost up to €0.19 per page from page 21 onward, everything else is free (AvTS § 25); a refusal can be contested with a vaie to Andmekaitse Inspektsioon or a complaint to an administrative court (AvTS § 46).

Limits

  • Drafting costs a step, and tools are switched off on the last step of the budget. Draft once you know which authority holds the data and what to ask for — do not exhaust the budget researching first.
  • This guide covers the citizen→authority direction only. Nothing here sends mail, and nothing here promises an answer will arrive.

Verify

  • The acts behind this guide, as read on 2026-07-26: AvTS redaction 106032026003 (§ 13–§ 25, § 46), MSVS redaction 118122024006 (§ 6, § 7), pühade ja tähtpäevade seadus redaction 120122022005 (§ 1–§ 3).
  • Require AvTS § 18 to still read "viie tööpäeva jooksul" before repeating the 5-working-day deadline. This is probed against the live source.
  • MSVS § 6 was 30 days before RT I, 18.12.2024, 2 and is now 15 calendar days. If a source says 30, it predates that change.

Module API

authority(nameOrRegCode) -> {name, kind, parent, email, phone, website, register, where, openData, page} searchAuthorities({name, kind, county, municipality, searchableRegister}) -> {total, rows, truncated}