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.
Vastused, mis on siit tulnud
- Amet viitab juhendile, mida ma ei näeSotsiaalkindlustusamet vähendas mu toetust ja viitas oma sisejuhendile, mida veebis ei leia. Kuidas ma selle juhendi kätte saan?2026-08-03
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 wants | Channel | kind | Deadline |
|---|---|---|---|
| Existing documents or data the authority already holds | teabenõue | information_request | 5 working days |
| An explanation, or an answer that needs analysis, synthesis or extra data gathering | selgitustaotlus | clarification_request | 15 calendar days |
| To propose something, or to pass on information about public life | märgukiri | memorandum | 15 calendar days |
| To contest a decision or a refusal | vaie | challenge | depends 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))
- the requester's first and last name;
- the name of the institution or legal person, if the request is made on its behalf;
- contact details (postal or email address, fax, phone) the answer can be sent to;
- the content of the requested information, or the type, name and content of the document, or identifiers the requester knows;
- 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 }
nullmeans 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.municipalityCodeis the EHAK code that statistics, election results, planning and official notices are keyed by.parentis 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 reciperegister.guidenames. Onadr.novian.eeonly/kiirotsingworks — its/otsinganswers 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: mostlyown(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.eefor Välisministeerium andlvpost@tallinnlv.eefor Tallinna Linnavalitsus, and an attempt at this one produced four different@mfa.eeaddresses, 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
subjectandnotefields 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 redaction118122024006(§ 6, § 7), pühade ja tähtpäevade seadus redaction120122022005(§ 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}