How it works
Inspraak (Dutch for "having a say") finds the open EU consultations an organisation should answer and shows what others have already said. It is an independent demo built by one person, not an official EU tool.
Five steps
- Read the organisationIts entry in the EU Transparency Register (goals, interests, category) and the answers it sent before.
- Find what fitsCompare it with every open consultation. A language model checks the 15 closest and writes one line on why each fits.
- Show who answeredWho already sent an answer and what they asked for. Every quote is checked word for word against their answer.
- Read the proposalThe passages of the Commission's document that touch the organisation's topics, with the page number.
- Draft only after a yesA person decides first. Then a draft is written, and every sentence without a source is removed. Nothing is sent to the Commission.
This public demo shows steps 1 to 4. Drafts and decisions stay in the local app.
The technical version: the agents behind it
One supervisor sends each organisation through seven agents and stops twice for a person.
- Supervisor
- Sends one run per organisation through the agents. It calls no model and decides only on what the run already holds.The run stops for a person at go / no-go, before anything is drafted, and again at draft review. Its state lives in a LangGraph Postgres checkpointer, so a run can wait days for a decision.
- Profiler
- Reads the organisation's register entry and the answers it sent before.Goals, interests, category and budget, shown as registered. A reviewer can correct the profile; corrections are stored as memory and the register is never changed.
- Matcher
- Finds the open consultations closest to the profile.Embedding similarity with a small multilingual model run locally, with a penalty for consultations close to almost every profile. Consultations of one initiative share a card. One language model call then judges the 15 strongest: a relevance between 0 and 1 and a one-line reason, cached, so reading a page never calls a model. "Not our topic" excludes a consultation and lowers similar ones next time.
- Landscape
- Shows who already answered and what they asked for.Counted by the stakeholder type and country each submitter declared on the portal. For each organisation's answer, one model call extracts a stance and up to three key asks with a verbatim quote. A quote not found character for character in the answer is dropped, and stances under 0.6 confidence wait for review.
- Lobby mapper
- Finds meetings with Commissioners' teams on the same subject.Matched on the short subject text of each meeting, so it is marked approximate everywhere. Counted by register category, never with a label such as "ally" or "opponent".
- Reader
- Picks the passages of the Commission's document that touch the organisation's topics.Read page by page and cited to the page of the PDF.
- Go / no-go
- A person decides whether the organisation should answer.Nothing is drafted without it.
- Drafter
- Writes a reply in the organisation's own voice.Within the portal's 4,000 character limit, based on its earlier answers.
- Critic
- Removes every sentence it cannot source.A fact needs a Commission passage. A position (we support, we call for, the Commission must) needs the organisation's own past answer or register goals; a Commission passage alone does not make it the organisation's view. The draft then waits for a person, and nothing is ever submitted to the Commission.
Stack: Python, Postgres with pgvector, Redis and Celery, LangGraph with a Postgres checkpointer, FastAPI with Jinja2 and HTMX, local embeddings (fastembed). Models: Gemini Flash for most of the work and the rerank, Claude Haiku for part of the answer analyses, and a deterministic stand-in for the tests.
Who it is for
Any of the 17,897 organisations in the EU Transparency Register: NGOs, companies, trade unions, business associations, universities. This demo shows 40 of them, all based in Brussels.
Where the data comes from
Three public EU sources, joined on the register ID of each organisation. The data is from 5 Oct 2026; consultations opened after that date are missing.
All numbers from this snapshot
Register: the full XML export, updated daily. Have Your Say: the portal's own JSON backend, one request per second. Meetings: the Commission's file for 2024 to 2029 (XLSX).
How good is it
About half of the suggestions are a real fit: 15 of 30 in a blind test. Use the list as a shortlist to check, not as a ranking to trust. Quotes are safer: 98.3% were found word for word, and the rest were dropped.
Full evaluation
Measured on the snapshot of 5 Oct 2026; the same figures are in the project's docs/EVAL.md.
| What | Result | How it was measured |
|---|---|---|
| Match precision | 15 of 30 suggested consultations relevant (50%); 6 of 9 first places right. | 30 random organisation and consultation pairs judged by a blind language-model judge against a written rubric, 11 Oct 2026; inputs and labels are in the repository under docs/eval/. |
| Recall against real filings | The consultation an organisation really answered is in its top 5 in 42.5% of cases by embedding alone (random order: 6.7%). On a sample of 150, the rerank raises that from 45.3% to 65.1%, median rank 6 to 2. | 1,526 registrants that filed on an in-scope consultation. |
| Quotes verified | 12,633 of 12,845 found word for word in their submission (98.3%). The rest were dropped before storage. | Every quote, checked by code, not by a model. |
| Submissions processed | 9,155 organisation submissions: 6,531 analysed, 2,624 without readable text (counted only). 778 stances held back for low confidence. | All of them, not a sample. |
| Critic | 38 of 49 draft sentences kept (77.6%) across the 5 current drafts; the others were removed and listed. | Drafts not rejected by a reviewer. |
| Runs | 49 current runs for 40 organisations (70 older runs replaced when the matcher changed). Reader cache: 560 of 563 summary reads. | Summaries and match judgments are shared, so a second organisation costs almost nothing. |
Not measured: whether an organisation would send a draft, and a second judge for precision.
Model calls by provider and purpose
| Provider | Purpose | OK | Failed |
|---|---|---|---|
| Gemini Flash, batch (gemini-3.8-flash-low) | critic | 4 | 0 |
| Gemini Flash, batch (gemini-3.8-flash-low) | draft | 4 | 0 |
| Gemini Flash, batch (gemini-3.8-flash-low) | feedback analysis | 30 | 0 |
| Gemini Flash, batch (gemini-3.8-flash-low) | feedback analysis batch | 507 | 0 |
| Gemini Flash, batch (gemini-3.8-flash-low) | match rerank | 190 | 0 |
| Gemini Flash, batch (gemini-3.8-flash-low) | reader summary | 36 | 0 |
| Claude Haiku, batch (haiku) | feedback analysis | 937 | 0 |
| Claude Haiku, batch (haiku) | feedback analysis batch | 86 | 0 |
| Claude Haiku, batch (haiku) | match rerank | 28 | 0 |
| Gemini Flash Lite, API (gemini-3.5-flash-lite) | critic | 5 | 0 |
| Gemini Flash Lite, API (gemini-3.5-flash-lite) | draft | 5 | 0 |
| Gemini Flash Lite, API (gemini-3.5-flash-lite) | feedback analysis | 240 | 1 |
| Gemini Flash Lite, API (gemini-3.5-flash-lite) | reader summary | 46 | 0 |
The command line providers do not report token counts.
Not official, and it can be wrong
- This is an independent project by one person. It is not made by, for or with the European Commission or any organisation on this site.
- The organisations shown did not ask for their page and do not use it. Each page is built from what the organisation itself made public in the register and on the portal.
- Summaries, match reasons and stances are written by AI and can be wrong. The Commission's own page is the source, and every consultation links to it.
- Citizens who answered a consultation are counted, never named or quoted.
- Found a mistake, or want your organisation's page removed? Mail nadirkaangoker@gmail.com. Removal requests are handled within 48 hours.
The full text is on the disclaimer page.
All limits, in detail
- Everything runs from a local snapshot (taken 5 Oct 2026, 23:30, Brussels time). A consultation published later is missing, and counts and deadlines can have moved since. Deadlines are shown as dates; the countdown is worked out in your browser.
- The Have Your Say endpoints are the portal's own backend, not a documented API.
- Scope: consultations closing within 90 days plus up to 40 recently closed ones with at least 20 organisation submissions. Feedback is capped at 5,000 rows per publication; five closed consultations are partial and say so.
- Matching is similarity plus one model judgment, not a guarantee. A "possible fit" is a prompt to check, not a filter.
- Quotes marked "machine translation by the Commission" come from the English translation the portal publishes next to a submission written in another language. The original language is named; the original wording can differ.
- Stakeholder types come from the portal's own declaration field and register categories from the register. The model never assigns a category.
- Meeting subjects are a few words ("EU environmental priorities"). A similarity threshold of 0.45 keeps the list useful, not exact.
- Scanned PDFs have no text layer and are not OCRed; such submissions appear as "without readable text".
- Summaries, stances and match reasons are cached per publication and shared, so one organisation's page may show a summary written days earlier.
- Citizens: no name, no text and no register number of an EU or non-EU citizen row is stored. A database constraint makes it impossible to insert one.
- Small firms: a submitter with no register number that declared itself a micro company is shown as "Micro company" and its country, because such a name is often a person's name. Long numbers in organisation names (tax or company numbers) are masked.