Woo requests (Wet open overheid)
Anyone may ask a gemeente for the information it holds on a subject; the Woo gives the gemeente four weeks to decide. Most of the work is finding the documents, reading them and blacking out (lakken) what may not be made public, each time with the ground from the law. Admin → Woo requests does that inside Goooy. Checked against the Woo as in force from 15 August 2026.
It is an administrator’s tool: collecting searches other people’s mail, files
and chat, which is an eDiscovery power. Every search, addition, assessment and
download is in the audit trail (woo.* actions; searches and
additions in the access category, the package in export).
The register and the term
A request is registered with what is asked, the requester, the gemeente’s own reference and the date of receipt. The decision is due:
| Period | Rule |
|---|---|
| Term | four weeks from the day after receipt (art. 4.4 lid 1) |
| Postponement (verdaging) | once, two more weeks, when the size or complexity of the information justifies it (lid 2). The requester must be told why; Goooy records the postponement, the letter is yours. |
| Suspension (opschorting) | the days third parties were given to state their views (lid 3, Awb 4:15); enter the number of days and the reason |
| Weekend or holiday | a term that ends on a Saturday, a Sunday or a Dutch public holiday moves to the next working day (Algemene termijnenwet art. 1). The days are those of art. 3: Nieuwjaarsdag, tweede Paas- and Pinksterdag, both Christmas days, Hemelvaartsdag, the King’s birthday and 5 May (every year), plus Goede Vrijdag, which lid 2 equates with them; lib/holidays.ts’ NL list is exactly that |
The list shows how many days are left, amber in the last week and red once the term has passed. A request is decided once no document is left unassessed; withdrawn when the requester withdraws it. A decided or withdrawn request is frozen; reopen it to make changes.
Not modelled: the two weeks after the decision before information goes out when a third party may object (lid 5), the ingebrekestelling and the penalty payment.
Postponing and suspending. Postponement (Woo art. 4.4 lid 2) must be notified before the first term ends: the last day
of the term is still allowed, the day after is refused (400); raising a suspension after the term has run out is refused
the same way, lowering one is allowed. Reading a collected document and downloading its preview PDF are audited
(woo.document.view, woo.document.pdf); audit details carry references and numbers, not request text or search terms.
Collecting
The Collect tab searches, like a legal hold’s scope:
- Custodians: the people who hold the information (users of the organization);
- a period (mail by date sent or received, files by last change, chat by day);
- search terms (all must occur; each is also a prefix), or none for everything in the period;
- which sources: mail, files, chat.
A mail that is in several custodians’ mailboxes (sent by one, received by the other) is one candidate. Its attachments can be added as separate documents, which is how Woo decisions usually treat them. A chat document is one conversation on one day (Amsterdam time), with every message of that day, not only the custodian’s; end-to-end encrypted channels can’t be read by the server and are left out.
What is added is copied as text: mail with its From / To / Cc / Date / Subject lines and the list of attachments, attachments and files through the same extractors as search (Word, Excel, PowerPoint, ODF, PDF with a text layer, plain text). Later changes or deletions in the mailbox don’t change what was assessed. A scanned PDF or an image yields no text; the document says so and must be assessed from the original.
Documents are numbered in the order they are added; that number is the number on the inventory list. Removing a document leaves a gap rather than renumbering.
A bare date in the collect period is a day in Amsterdam (both ends inclusive). When the candidate cap is reached the result
says so (truncated), also when duplicates were folded.
Assessing and redacting
Each document gets one assessment:
| Assessment | In the package |
|---|---|
| Public | the document, as PDF |
| Partly public | the document with its redactions, as PDF |
| Not public | on the inventory list with its grounds, not published |
| Already public | on the inventory list; refer to where it is published |
| Outside the request | left off the inventory list |
To redact, select text in the document and press Redact selection with the chosen ground; click a redaction to undo it. Suggest redactions marks BSNs and passport, ID-card and driving-licence numbers (5.1.1e) and e-mail addresses, phone numbers, IBANs and postcode + house number (5.1.2e), with the DLP detectors. Names aren’t detected: read the document. A document withheld in full needs at least one ground. The title can be changed for publication, since a subject line can itself say too much.
The grounds and the codes printed on the boxes:
| Code | Ground | Weighing |
|---|---|---|
| 5.1.1a–e | unity of the Crown, State security, business data supplied in confidence, special categories of personal data, identification numbers | absolute |
| 5.1.2a–i | international relations, economic or financial interests, investigation and prosecution, inspection and supervision, privacy, competition-sensitive business data, the environment, security of persons and businesses, the proper functioning of the government | weighed against the public interest; motivate it (art. 5.1 lid 3) |
| 5.1.5 | disproportionate harm | weighed |
| 5.2.1 | personal policy opinions in documents for internal deliberation |
For information older than five years a refusal on 5.1.2, 5.1.5 or 5.2 needs an extra motivation (art. 5.3). The decision text is yours; Goooy doesn’t write it.
The package
Download package (possible once nothing is left unassessed) gives a zip:
inventarislijst.csv: number, title, date, type, assessment, grounds, note (semicolons and a byte-order mark, so Dutch Excel opens it);documenten/NNNN <title>.pdf: every public and partly public document;weigeringsgronden.csv: the grounds used, with their article.
The PDFs are drawn from the redacted text: a redacted span never enters the file. There is no text layer under a black box, no metadata beyond the title and no hidden copy, so copying text out of the PDF or removing the boxes shows nothing. Each box is as wide as its code, not as the text it hides. The price is the original layout: a Word document or a PDF becomes plain text. Preview PDF shows one document exactly as it will be published.
Not done
- publishing to the Woo-index / open.overheid.nl, and the DiWoo metadata;
- redacting inside the original layout (Word, PDF), and scanned documents (no OCR);
- the besluit itself, zienswijze letters to third parties, and deduplication of near-identical documents;
- a separate Woo-coordinator role: it needs an organization administrator;
- the desktop app.
API
All under /api/v1/admin/woo (ORGADMIN in their own organization; SYSADMIN may
pass orgId): GET /grounds; GET|POST /requests; GET|PATCH /requests/{id}
(status, extended, suspendedDays + suspensionReason, subject,
reference, notes); POST /requests/{id}/searches (custodianIds, from,
to, query, types); GET|POST /requests/{id}/documents (items: [{type: mail|attachment|file|chat, id}]); GET|PATCH|DELETE /requests/{id}/documents/{docId} (assessment, grounds, redactions: [{start, end, ground}] over the document text, title, note);
GET .../{docId}/suggestions; GET .../{docId}/pdf; GET /requests/{id}/package.
Tests: apps/api/test/smoke-woo.mjs (end to end, in run-all),
apps/api/test/woo.test.ts (term, suggestions, the PDF holds no redacted text),
apps/web/e2e/woo.spec.ts.