Independent demo, not an official EU site. AI summaries can be wrong; data from 5 Oct 2026. Disclaimer

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

  1. Read the organisationIts entry in the EU Transparency Register (goals, interests, category) and the answers it sent before.
  2. Find what fitsCompare it with every open consultation. A language model checks the 15 closest and writes one line on why each fits.
  3. Show who answeredWho already sent an answer and what they asked for. Every quote is checked word for word against their answer.
  4. Read the proposalThe passages of the Commission's document that touch the organisation's topics, with the page number.
  5. 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
17,897registrants (2,786 with a Belgian head office)
81publications in scope, 41 open on 5 Oct 2026
9,181organisation submissions; 2,361 join the register
23,351citizen rows, counted only
36,563pages from 3,411 documents, 140,033 chunks
11,531meetings, 16,419 organisation links

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.

WhatResultHow it was measured
Match precision15 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 filingsThe 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 verified12,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 processed9,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.
Critic38 of 49 draft sentences kept (77.6%) across the 5 current drafts; the others were removed and listed.Drafts not rejected by a reviewer.
Runs49 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

ProviderPurposeOKFailed
Gemini Flash, batch (gemini-3.8-flash-low)critic40
Gemini Flash, batch (gemini-3.8-flash-low)draft40
Gemini Flash, batch (gemini-3.8-flash-low)feedback analysis300
Gemini Flash, batch (gemini-3.8-flash-low)feedback analysis batch5070
Gemini Flash, batch (gemini-3.8-flash-low)match rerank1900
Gemini Flash, batch (gemini-3.8-flash-low)reader summary360
Claude Haiku, batch (haiku)feedback analysis9370
Claude Haiku, batch (haiku)feedback analysis batch860
Claude Haiku, batch (haiku)match rerank280
Gemini Flash Lite, API (gemini-3.5-flash-lite)critic50
Gemini Flash Lite, API (gemini-3.5-flash-lite)draft50
Gemini Flash Lite, API (gemini-3.5-flash-lite)feedback analysis2401
Gemini Flash Lite, API (gemini-3.5-flash-lite)reader summary460

The command line providers do not report token counts.

Not official, and it can be wrong

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.

Who built it

I'm Kaan. I did the Advanced Master of Artificial Intelligence at KU Leuven and specialized in natural language processing and speech recognition. EU consultations looked like a good test for that: the data is public, but it sits on three sites and in many languages, and a small organisation rarely has a free day to read it all. I wanted to see how much of that reading a few agents with strict sourcing rules could do, and where they still get it wrong.